月月查华华手机

alt

解题思想

不用一边一边浏览华华的昵称,而是有目的性地在字符串上跳跃。

代码:

#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;
}