题目描述
给定 NN 个字符串 S1,S2,...,SNS1,S2,...,SN 和 MM 个询问,每个询问包含一个字符串 TiTi,问 TiTi 是否在 S1S1 或 S2S2 ... 或 SNSN 的前缀出现过。
输入描述
输入第一行包含两个整数 N,MN,M ,分别表示给定字符串的数量和询问的个数。
第 2∼N+12∼N+1 行每行包含一个字符串 SiSi。
接下来 MM 行每行包含一个字符串 TiTi。
1≤N,M≤1051≤N,M≤105。2≤∣S1+...+SN+T1+...+TM)∣≤2×1062≤∣S1+...+SN+T1+...+TM)∣≤2×106。
保证 Si,TiSi,Ti 只包含小写字母。
输出描述
输出共 MM 行,每行包含一个整数,表示对应询问的回答。
若存在则输出 YY,否则输出 NN。
输入输出样例
示例 1
输入
5 3
aaa
aba
aabbaa
abbbbb
cdd
aabba
abc
abab
输出
Y
N
N
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 2e6 + 10;
int t[N][26];
int cnt[N];
int idx = 0;
void insert(string s) {
int p = 0;
for (int i = 0; i < s.size(); i++) {
char c = s[i] - 'a';
if (!t[p][c]) {
t[p][c] = ++idx;
}
p = t[p][c];
cnt[p]++;
}
}
int find(string s) {
int p = 0;
for (int i = 0; i < s.size(); i++) {
char c = s[i] - 'a';
if (!t[p][c]) {
return 0;
}
p = t[p][c];
}
return cnt[p];
;
}
signed main() {
int n, m;
cin >> n >> m;
string s;
for (int i = 0; i < n; i++) {
cin >> s;
insert(s);
}
for (int i = 0; i < m; i++) {
cin >> s;
if (find(s) != 0) {
cout << "Y\n";
} else
cout << "N\n";
}
return 0;
}