zoukankan      html  css  js  c++  java
  • 序列自动机(模板)

    给字符串 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
    ");
            else printf("NO
    ");
    
        }
        return 0;
    }
    

      

  • 相关阅读:
    GDUFE ACM-1093
    GDUFE ACM-1088
    GDUFE ACM-1069
    GDUFE ACM-1051
    GDUFE ACM-1049
    GDUFE ACM-1046
    GDUFE ACM-1045
    GDUFE ACM-1043
    OpenCV学习(7.12)
    OpenCV学习(7.11)
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/10820131.html
Copyright © 2011-2022 走看看