序列自动机(模板)

给字符串 s 然后 Q 次询问 字符串 t 是不是 s 的子序列 

序列自动机是用来判断是否是子序列的算法 时间复杂度是 $O(len)$ 

nx[i][j] 数组存的是在 s 中第 i 位后面第一个 j 字母出现的位置

 

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e6 + 10;
int nx[maxn][30];
string s;

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

int main() {
    cin >> s;
    init();
    int Q;
    scanf("%d", &Q);
    while(Q --) {
        string t;
        cin >> t;
        bool flag = true;
        int lt = t.length();
        int st = 0;
        for(int i = 0; i < lt; i ++) {
            st = nx[st][t[i] - 'a'];
            if(st == 0) {
                flag = false;
                break;
            }
        }

        if(flag) printf("YES\n");
        else printf("NO\n");

    }
    return 0;
}

  

 

posted @ 2019-05-06 15:57  丧心病狂工科女  阅读(1224)  评论(1编辑  收藏  举报