Prob
给你一个长度为1000000字符串s
然后给你1000000个问题
问a是不是s的子序列
Sol:
序列自动机是用来判断是否是子序列的算法 时间复杂度是 O(len)
nx[i][j] 数组存的是在 s 中第 i 位后面第一个 j 字母出现的位置
Prog:
#include<bits/stdc++.h> #define rint register int #define deb(x) cerr<<#x<<" = "<<(x)<<'\n'; using namespace std; typedef long long ll; typedef pair <int,int> pii; const ll mod = 1e9 + 7; const int maxn = 1e6 + 10; int n, t, nxt[maxn][30]; char s[maxn], str[maxn]; int main() { scanf("%s", s+1); int len = strlen(s+1); for(int i=len; i; i--) //逆循环 { for(int j=0; j<26; j++) //26个字母 nxt[i-1][j] = nxt[i][j]; nxt[i-1][s[i]-'a'] = i; } int a,b; /* while (true) { cin>>a>>b; cout<<nxt[a][b]<<endl; } */ scanf("%d", &t); while(t--) { scanf("%s", str); int lenc = strlen(str), f = 0; for(int i=0, now=0; i<lenc; i++) { now = nxt[now][str[i]-'a']; if(!now) { f = 1; break; } } if(f) puts("No"); else puts("Yes"); } }