NC25138 子串查詢
阿新 • • 發佈:2020-12-15
新名詞\(get\):序列自動機
思路挺好想的,一共\(n\)個位置,對每個位置建立\(26\)個指標,指向後面第一次出現對應字母的位置。倒序處理一遍即可。
注意:
- 不存在對應字母的話位置記為\(0\)
- 下標\(0\)也要初始化
子序列進行匹配時從下標\(0\)開始匹配,下標\(0\)存放的指標代表\(1~n\)中第一次出現對應字母的位置
const int N=1e5+10; char s[N],t[N]; int ne[N][26]; int n,q; void init() { for(int i=n-1;i>=0;i--) { for(int j=0;j<26;j++) ne[i][j]=ne[i+1][j]; ne[i][s[i+1]-'a']=i+1; } } int main() { cin>>n>>q; cin>>s+1; init(); while(q--) { cin>>t+1; int m=strlen(t+1); bool ok=true; for(int i=1,k=0;i<=m;i++) { if(ne[k][t[i]-'a']) k=ne[k][t[i]-'a']; else { ok=false; break; } } if(ok) puts("YES"); else puts("NO"); } //system("pause"); }