1. 程式人生 > 實用技巧 >NC25138 子串查詢

NC25138 子串查詢

新名詞\(get\):序列自動機

思路挺好想的,一共\(n\)個位置,對每個位置建立\(26\)個指標,指向後面第一次出現對應字母的位置。倒序處理一遍即可。

注意:

  • 不存在對應字母的話位置記為\(0\)
  • 下標\(0\)也要初始化

子序列進行匹配時從下標\(0\)開始匹配,下標\(0\)存放的指標代表\(1~n\)中第一次出現對應字母的位置

const int N=1e5+10;
char s[N],t[N];
int ne[N][26];
int n,q;

void init()
{
    for(int i=n-1;i>=0;i--)
    {
        for(int j=0;j<26;j++)
            ne[i][j]=ne[i+1][j];
        ne[i][s[i+1]-'a']=i+1;
    }
}

int main()
{
    cin>>n>>q;

    cin>>s+1;

    init();

    while(q--)
    {
        cin>>t+1;

        int m=strlen(t+1);
        bool ok=true;
        for(int i=1,k=0;i<=m;i++)
        {
            if(ne[k][t[i]-'a'])
                k=ne[k][t[i]-'a'];
            else
            {
                ok=false;
                break;
            }
        }
        if(ok) puts("YES");
        else puts("NO");
    }
    //system("pause");
}