链接:NC25138子串查询
题面:
样例输入:
8 4
ababcbaa
abac
accb
aaaa
abcba
样例输出:
YES
NO
YES
YES
该代码中所有字符串以1为初始位置
nxt[i][j]数组表示s串中第i个字符之后(即不包括i)第一个出现j+'a'字符的位置。若不存在赋为-1.
那么在遍历t串的时候贪心的找到下一个字符的位置即可,如果在找到最后一个字符之前找到的是-1,说明不存在该子串
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+50;
int n,q;
char s[maxn],t[55];
int nxt[maxn][39];
queue<int> que[26];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>q>>s+1;
for(int i=1;i<=n;i++){
que[s[i]-'a'].push(i);
}
for(int i=0;i<26;i++){
if(que[i].size())
nxt[0][i]=que[i].front();
else nxt[0][i]=-1;
}
for(int i=1;i<=n;i++){
que[s[i]-'a'].pop();
for(int j=0;j<26;j++){
if(que[j].size()) nxt[i][j]=que[j].front();
else nxt[i][j]=-1;
}
}
while(q--){
cin>>t+1;
bool flag=true;
for(int i=1,pos=0;i<=strlen(t+1);i++){
pos=nxt[pos][t[i]-'a'];
if(pos==-1){
flag=false;
break;
}
}
if(!flag) puts("NO");
else puts("YES");
}
return 0;
}