枚举优化
https://ac.nowcoder.com/acm/problem/23053
这题目描述这么费劲干啥啊==''==
题目:给定序列s,t,判断t是否是s的子序列
思想可以参考KMP利用next数组匹配子串,我们维护一个next[i][a,b,c……z]来表示第i个字母后面的第一个a,b……字母位置;注意:比如s中有两个以上a字母,匹配时候肯定是选前面的,因为前面的如果匹配不了t,后面的就更不可能。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
int nex[maxn][26];
int last[26]={0};
void pre(string s)
{
memset(last,-1,sizeof(last));
int len=s.size();
for(int i=len-1;i>=0;--i){
int c=s[i]-'a';
//cout<<c<<endl;
memcpy(nex[i],last,sizeof(int)*26);
last[c]=i;
}
return;
}
int main(){
string s;cin>>s;
int n;cin>>n;
pre(s);
for(int i=0;i<n;++i){
bool ok=false;
string t;cin>>t;
int len=t.size();
int ne=last[t[0]-'a'];
for(int i=1;i<len;++i){
ne=nex[ne][t[i]-'a'];
//cout<<t[i]<<" "<<ne<<endl;
if(ne==-1) {
cout<<"No"<<endl;
ok=true;
break;
}
}
if(!ok)cout<<"Yes"<<endl;
}
} 
京公网安备 11010502036488号