题目链接:https://nanti.jisuanke.com/t/38232
题目大意:给你一个字符串,然后再给你m个字符串,然后问你在第一个字符串中不连续的子串能不能构成输入的子串。
具体思路:构建一个序列自动机就可以了。刚接触,记录下
AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 # define inf 0x3f3f3f3f 5 const int maxn =2e5+100; 6 const int mod = 1e9+7; 7 char str[maxn]; 8 int now[30]; 9 int nex[maxn][30]; 10 void init() 11 { 12 memset(now,-1,sizeof(now)); 13 int len=strlen(str); 14 for(int i=len-1; i>=0; i--) 15 { 16 for(int j=0; j<26; j++) 17 { 18 nex[i][j]=now[j]; 19 } 20 now[str[i]-'a']=i; 21 } 22 } 23 int main() 24 { 25 scanf("%s",str); 26 init(); 27 int m; 28 scanf("%d",&m); 29 while(m--) 30 { 31 scanf("%s",str); 32 int len=strlen(str); 33 int pos=now[str[0]-'a']; 34 int flag=1; 35 if(pos==-1) 36 flag=0; 37 for(int i=1; i<len; i++) 38 { 39 pos=nex[pos][str[i]-'a']; 40 if(pos==-1) 41 { 42 flag=0; 43 break; 44 } 45 } 46 if(!flag) 47 printf("NO "); 48 else 49 printf("YES "); 50 } 51 return 0; 52 }