题意:输入一个主字符串,在生成一个新的字符串,push是在末尾读入一个字符,pop是从位删除一个字符,如果新的字符串是主字符串的子序列那么就输出yes,否者输出no。
很显然这个题每一次读入或者删除一个字符都重新判断一下是不是子序列肯定会超时,需要每读入一个字符或者删除一个就能直接判断是否为子序列才行,这时我用了一个二维数组dd[200100][27],来保存 当前这个位置的后面的 离当前位置最近的 每一个字母的位置 就相当于是一个next数组。
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <map> #include <iostream> #include <algorithm> #include <set> #include <vector> #include <queue> #include <ctime> #include <stack> using namespace std; typedef long long ll; char str[200010]; int dd[200010][27],before[200010]; int main() { int T,len; scanf("%s",str+1); len=strlen(str+1); for(int i=len-1; i>=0; i--) { for(int j=0; j<26; j++) { dd[i][j]=dd[i+1][j]; } dd[i][str[i+1]-'a']=i+1; } // for(int i=1;i<=len;i++) // printf("%d ",dd[i][1]); int xx=0,wa=0; before[0]=0; char asd[10]; scanf("%d",&T); while(T--) { scanf("%s",asd); if(asd[1]=='u') { char c[5],cc; scanf("%s",c); cc=c[0]; if(wa) { wa++; printf("NO\n"); } else { if(dd[xx][cc-'a'])///它的下一个有cc { before[dd[xx][cc-'a']]=xx; xx=dd[xx][cc-'a']; printf("YES\n"); } else { wa++; printf("NO\n"); } } } else { if(wa==1)///不用更新 { wa--; printf("YES\n"); } else if(wa>1) { wa--; printf("NO\n"); } else if(wa==0) { xx=before[xx];///更新 printf("YES\n"); } } } return 0; }