- 给定一个主串,和若干匹配串,判断匹配串是否在主串中出现,不必相连,只要字母和对应先后顺序符合即可。
- 不同于KMP,KMP要求相连
输入
noiauwfaurainairtqltqlmomomo
8
rain
air
tql
ntt
xiaobai
oiiiooo
orzcnzcnznb
ooooo
输出
Yes
Yes
Yes
Yes
No
Yes
No
No
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1e6+5;
char s[maxn];
int now[30];//记录字母最早出现的位置
char t[maxn];
int nex[maxn][30];//nex[i][j]记录在主串第i个字符之后('a'+j)第一次出现的位置
void init(){
memset(now,-1,sizeof(now));
int len=strlen(s);
for(int i=len-1;i>=0;i--){
for(int j=0;j<26;j++)
nex[i][j]=now[j];//初始now[]均为-1,在主串最后一个字符之后没有字符了,故now[len-1][]均为-1
now[s[i]-'a']=i;//不断更新
}
}
int main(){
scanf("%s",s);
init();//对主串预处理
int n;scanf("%d",&n);
int loc,len;
bool f=0;
while(n--){
scanf("%s",t);
//nex[0][]为第0个字符之后每个字母第一次出现的位置,nex[]无法判断第一个字符的匹配情况
loc=now[t[0]-'a']; //第一个字符的匹配情况需要特判,若now[t[0]-'a']==-1表明这个字符在主串中没有出现过
f=0;
//cout<<loc<<endl;
if(loc==-1)printf("No\n");
else {
len=strlen(t);
for(int i=1;i<len;i++){
loc=nex[loc][t[i]-'a'];
// cout<<loc<<endl;
if(loc==-1){
// printf("No\n");
f=1;
break;
}
}
if(!f)printf("Yes\n");
else printf("No\n");
}
}
return 0;
}