思路:用nex[i][a'b'...'z]表示在i位置后第一次出现a'b'....'z的位置,从后往前推nex数组,用last['a'b..'z]表示最早出现的位置。通过nex数组这样我们查询B串是否出现就是O(B的长度)
#include <iostream> #include <algorithm> #include <cstdio> #include <set> #include <sstream> #include<string> #include<queue> #include<stack> #include<map> #include<cmath> #include<cctype> #include<cstring> #include<cstdlib> #define MAXX 100005 #define SIS std::ios::sync_with_stdio(false) #define ll long long #define INF 0x3f3f3f3f #include<bits/stdc++.h> using namespace std; const int MAX =1e6+20; const double PI = 3.14159265359; //const int mod = 1e9 + 7; char ch[MAX]; char s[MAX]; int nex[MAX][30],last[MAX]; void init() { memset(last,-1,sizeof(last)); int len=strlen(s); for(int i=len-1;i>=0;i--) { for(int k=0;k<=26;k++) { nex[i][k]=last[k]; } last[s[i]-'a']=i; } } int judge() { int len=strlen(ch); int k=last[ch[0]-'a'];///获取子串第一个字母在文本串的位置 if(k==-1)return 0; for(int i=1;i<len;i++) { k=nex[k][ch[i]-'a'];///更新位置 if(k==-1)return 0; } return 1; } int main() { scanf("%s",s); init(); int n; scanf("%d",&n); while(n--) { scanf("%s",ch); if(judge()) printf("Yes\n"); else printf("No\n"); } return 0; }