4 solutions

  • 3
    @ 2022-1-2 14:23:41

    经典火车进站问题

    只是要记录入站出站的次序而已

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
    	int t,n;
    	cin>>t;
    	while(t--){
    		vector<string>ans;//我用这个来记录入栈出栈
    		stack<char>zh;
    		cin>>n;
    		string s,f;
    		cin>>s>>f;
    		for(int i=0,p=0;i<n;i++){
    			ans.push_back("in");
    			zh.push(s[i]);
    			while(!zh.empty()&&zh.top()==f[p]){
    				p++;
    				ans.push_back("out");
    				zh.pop();
    			}
    		}
    		if(!zh.empty())cout<<"No.\nFINISH"<<endl;
    		else {
    			cout<<"Yes."<<endl;
    			for(string w:ans)
    				cout<<w<<endl;
    			cout<<"FINISH"<<endl;
    		}
    		getchar();
    	}
    	return 0;
    }
    
    • 1
      @ 2022-1-2 23:09:35

      思路

      其实这道题跟上面有一道火车变轨思路一样只是多了两个地方不同,一是不是按顺序输入,二是需要输出火车出站入站顺序

      注意事项

      1、我卡在输出的地方了看了一下大佬的题解,然后发现vactor可以进行存储字符串,这玩意是真好用 2、我卡在存储了vector不知道怎么正向怎么输出,想了一会想起了迭代器这东西;迭代器和vector结合起来可以想怎么输出就怎么输出;

      #include<bits/stdc++.h>
      using namespace std;
      string a;
      string b;
      vector <string> v;
      stack <int> s;
      int main(){
      	int t;
      	cin>>t;
      	for(int i=0;i<t;i++){
      		int n;
      		cin>>n;
      		cin>>a>>b;
      		int k=0;
      		for(int j=0;j<n;j++){
      			s.push(a[j]-'0');//上一题这里是默认的升序;这里是任意所以我们需要这样改变一下
      			v.push_back("in");
      			if(b[k]-'0'==s.top()){
      				while(!s.empty()){
      					if(b[k]-'0'==s.top()){
      						v.push_back("out");
      						s.pop();
      						k++;
      					}
      					else{
      						break;
      					}
      				}
      			}
      		}
      		if(!s.empty()){
      			cout<<"No."<<endl<<"FINISH"<<endl;
      		}
      		else{
      			cout<<"Yes."<<endl;
      			for(vector<string>::iterator f = v.begin();f!=v.end();f++){
      				cout<<*f<<endl;
      			}
      			cout<<"FINISH"<<endl;	
      		}
      		v.clear();
      		while(!s.empty()){
      			s.pop();
      		}
      	}
      	return 0;
      }
      
      • 1
        @ 2022-1-2 15:52:49

        感谢欧云峰大佬,不然还真不知道怎么记录入栈,那个vector.at()是我网上找的,据说可以读取栈

        #include<stdio.h>
        #include<stack>
        #include <vector>
        #include<iostream>
        #include<string.h>
        using namespace std;
        int main()
        {
            int n,num;
            char s1[100];
            char s2[100];
            scanf("%d",&n);
            while(n--){
            	scanf("%d",&num);
            	scanf("%s %s",s1,s2);
            	stack<char> train;
                vector<int> member;
                int j = 0;
                for(int k = 0;k < num;k++)
                {
                	train.push(s1[k]);
                	member.push_back(1);
                	while(!train.empty()&&train.top() == s2[j])
                	{
                		member.push_back(0);
                		train.pop();
                		j++;
        			}
        		}
        		if(train.size()==0){
        			printf("Yes.\n");
        			for(int k = 0;k<member.size();k++)
        			{
        				if(member.at(k))
        				{
        					printf("in\n");
        				}
        				else
        				{
        					printf("out\n");
        				}
        			}
        		}
        		else
        		{
        			printf("No.\n");
        		}
        		printf("FINISH\n");
        		memset(s1,0,sizeof(s1)); 
        		memset(s2,0,sizeof(s2)); 
        	}
        	return 0;
         } 
        
        • 0
          @ 2022-2-22 11:50:02

          有三个值得注意的点 1.记得每次初始化数组 2.输入要用char类型 3.不要看我这个菜鸡写的

          #include<iostream>
          #include<cstring>
          #include<stack> 
          using namespace std;
          int n,t,l=0,a[37],k=0;
          char o[17],O[17];
          int main(){
          	cin>>t;
          	while(t--){
          		int flag=0;
          		l=0,k=0;
          		memset(a,0,sizeof(a));
          		memset(o,'\0',sizeof(o));
          		memset(O,'\0',sizeof(O));
          		stack<char>ans;
          		cin>>n;
          		for(int i=0;i<n;i++)cin>>o[i];
          		for(int i=0;i<n;i++){
          			cin>>O[i];
          			a[k]=1;
          			k++;
          			if(O[l]==o[i]){
          				l++;
          				a[k]=0;
          				k++;
          				while(!ans.empty()){
          					if(ans.top()==O[l]){
          						l++;
          						ans.pop();
          						a[k]=0;
          						k++;
          					}
          					else break;
          				}
          			}
          			else ans.push(o[i]);
          		}
          		while(!ans.empty()){
          			if(ans.top()==O[l]){
          				l++;
          				ans.pop();
          				a[k]=0;
          				k++;
          			}
          			else {
          				cout<<"No."<<endl<<"FINISH"<<endl;
          				flag=1;
          				break;
          			}
          		}
          		if(!flag){
          			cout<<"Yes."<<endl;
          			for(int i=0;i<2*n;i++){
          				if(a[i]==1)cout<<"in"<<endl;
          				else cout<<"out"<<endl;
          			}
          			cout<<"FINISH"<<endl;
          		}
          	}
          	return 0;
          }
          
          • 1

          Information

          ID
          340
          Time
          1000ms
          Memory
          256MiB
          Difficulty
          3
          Tags
          # Submissions
          38
          Accepted
          15
          Uploaded By