牛客竞赛 1023 子序列自动机I

题意

多次查询在字符串中是否存在某子序列

思路

子序列自动机的模板题

代码

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

inline int read() {
    int ans = 0, f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9') {
        if (ch == '-')f = -1;
        ch = getchar();
    }
    while (ch <= '9' && ch >= '0') {
        ans = ans * 10 + ch - '0';
        ch = getchar();
    }
    return ans * f;
}
int nxt[2000005][30];
int cur[30];
string s;
int n;
void Q(string t) {
    int p = 0;
    for (int i = 0; i < t.size(); i++) {
        if (s[p] ==t[i]) {
            continue;
        }
        p = nxt[p][t[i]-'a'] + 1;
        if (p >= n+1 && i != t.size()-1) {
            cout<<"NO\n";
            return ;
        }
    }
    cout<<"YES\n";
}
int main() {
    cin>>s;
    for (int i =0; i < 26; i++)
        cur[i] = s.size();
    n = s.size()-1;

    for (int i = s.size()-1; i>=0;i--) {
        for (int j = 0; j< 26; j++)
            nxt[i][j] = cur[j];
        cur[s[i]-'a'] = i;
    }
    int q= read();
    while (q--) {
        string t;
        cin>>t;
        Q(t);
    }
    return 0;
}
posted @ 2025-06-19 17:31  Guaninf  阅读(9)  评论(0)    收藏  举报