牛客练习赛51 子串查询 (序列自动机)

链接:https://ac.nowcoder.com/acm/contest/1083/B
来源:牛客网
 

题目描述

给出一个长度为n的字符串s和q个查询。对于每一个查询,会输入一个字符串t,你需要判断这个字符串t是不是s的子串。子串的定义就是存在任意下标a

输入描述:

第一行两个数n,q。1<=n,q<=1e5。

第二行一个长度为n的字符串s,所有字符都为小写拉丁字符。

接下来q行每行一个字符串t。1<=|t|<=50。

输出描述:

对于每个查询,如果t是s的字串,输出”YES”,否则输出”NO”。每个答案占一行。

示例1

输入

复制

8 4
ababcbaa
abac
accb
aaaa
abcba

输出

复制

YES
NO
YES
YES
/*
@Author: Top_Spirit
@Language: C++
*/
#include 
using namespace std ;
typedef unsigned long long ull ;
typedef long long ll ;
const int Maxn = 1e5 + 10 ;
const ll INF = 1e12 + 10 ;
const double PI = acos(-1.0) ;
const int seed = 133 ;

string s1, s2;
int n, q ;
int pre[Maxn], Next[Maxn][26] ;

void init(){
    memset(pre, -1, sizeof pre) ;
    int len = s1.size() ;
    for (int i = len - 1; i >= 0; i--){
        for (int j = 0; j < 26; j++){
            Next[i][j] = pre[j] ;
        }
        pre[s1[i] - 'a'] = i ;
    }
}

int main (){
    cin >> n >> q ;
    cin >> s1 ;
    init() ;
    while (q--){
        cin >> s2 ;
        int len = s2.size() ;
        bool flag = false ;
        int ch = pre[s2[0] - 'a'] ;
        if (ch == -1) cout << "NO" << endl ;
        else {
            for (int i = 1; i < len; i++){
                ch = Next[ch][s2[i] - 'a'] ;
                if (ch == -1) {
                    flag = true ;
                    break ;
                }
            }
            if (flag) cout << "NO" << endl ;
            else cout << "YES" << endl ;
        }
    }
    return 0 ;
}

 

你可能感兴趣的:(序列自动机,strings)