月月查华华手机
解题思想
不用一边一边浏览华华的昵称,而是有目的性地在字符串上跳跃。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1000010;
int ne[N][26],xin[26]={-1};//xin记录第i个字符后面26个字符的位置,ne表示第i个字符后26个字母最靠前的位置,若没有就为-1.
char s[N];//华华的昵称
char a[N];//推荐好友的昵称
int len1,len2;
int n;
int main()
{
scanf("%s",s);
len1=strlen(s);
memset(xin, -1, sizeof xin);//将xin数组填成-1,-1也会更新给ne数组
for(int i=len1-1;i>=0;i--)
{
for(int j=0;j<26;j++)
ne[i][j]=xin[j];//将26个字符最新位置更新给ne数组
xin[s[i]-'a']=i;//更新一下xin数组
}
cin>>n;
while(n--)
{
scanf("%s",a);
int pos=xin[a[0]-'a'];
int flag=1;
len2=strlen(a);
for(int i=1;i<len2;i++)
{
if(pos==-1)
{
flag=0;break;//如果是-1代表不存在
}
pos=ne[pos][a[i]-'a'];//跳到下一个字母
}
if(flag &&pos!=-1) puts("Yes");
else puts("No");
}
return 0;
}