月月查华华的手机
输入
noiauwfaurainairtqltqlmomomo
8
rain
air
tql
ntt
xiaobai
oiiiooo
orzcnzcnznb
ooooo
输出
Yes
Yes
Yes
Yes
No
Yes
No
No
思路:
序列自动机看看这篇博客关于序列自动机
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;
string s,t;
int ne[N][30];
int tree[30];//在字符串最前面出现的位置
void build()//建树
{ memset(tree,-1,sizeof(tree));//初始化未出现的字符
//处理每一个字符
for(int i=s.length();i>=0;i--)
{
//找出第i个字符后面的26个字母最早出现的字符的位置
for(int j=0;j<26;j++)
ne[i][j]=tree[j];
//用当前字符更新当前字符在原串中从后向前最晚出现的位置
tree[s[i]-'a']=i;
}
}
bool check()//查询子序列
{
int start=tree[t[0]-'a'];//start为t第一个字符位置
if(start==-1)
return false;//第一个字符不在s中
for(int i=1;i<t.length();i++)
{
start=ne[start][t[i]-'a'];//位置移动的下一个字符的位置
if(start==-1)
return false;
}
return true;
}
int main()
{
int n;
getline(cin,s);
build();
cin>>n;
while(n--)
{
cin>>t;
if(check())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}return 0;
}