牛客竞赛 1023 子序列自动机I
题意
多次查询在字符串中是否存在某子序列
思路
子序列自动机的模板题
代码
#include<bits/stdc++.h>
using namespace std;
inline int read() {
int ans = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')f = -1;
ch = getchar();
}
while (ch <= '9' && ch >= '0') {
ans = ans * 10 + ch - '0';
ch = getchar();
}
return ans * f;
}
int nxt[2000005][30];
int cur[30];
string s;
int n;
void Q(string t) {
int p = 0;
for (int i = 0; i < t.size(); i++) {
if (s[p] ==t[i]) {
continue;
}
p = nxt[p][t[i]-'a'] + 1;
if (p >= n+1 && i != t.size()-1) {
cout<<"NO\n";
return ;
}
}
cout<<"YES\n";
}
int main() {
cin>>s;
for (int i =0; i < 26; i++)
cur[i] = s.size();
n = s.size()-1;
for (int i = s.size()-1; i>=0;i--) {
for (int j = 0; j< 26; j++)
nxt[i][j] = cur[j];
cur[s[i]-'a'] = i;
}
int q= read();
while (q--) {
string t;
cin>>t;
Q(t);
}
return 0;
}

浙公网安备 33010602011771号