#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
using namespace std;
const int MAXN = 1010*55;
int Next[MAXN][26], fail[MAXN], v[MAXN];
int L, root;
int num[1010];
string s2[1010];
int N;
int newnode() {
for(int i = 0; i < 26; i++) Next[L][i] = -1;
fail[L] = -1;
v[L] = 0;
L++;
return L-1;
}
void insert(string s, int n) {
int l = (int)s.length();
int now = root;
for(int i = 0; i < l; i++) {
int id = s[i]- 'A';
if(Next[now][id] == -1) Next[now][id] = newnode();
now = Next[now][id];
}
v[now] = n;
}
void setfail() {
queue<int> q;
q.push(root);
while(!q.empty()) {
int now = q.front(); q.pop();
for(int i = 0; i < 26; i++) if(Next[now][i] != -1) {
int pre = fail[now];
while(pre != -1 && Next[pre][i] == -1) pre = fail[pre];
fail[Next[now][i]] = pre == -1 ? root : Next[pre][i];
q.push(Next[now][i]);
}
}
}
void query(string s) {
int now = root;
int l = (int)s.length();
for(int i = 0; i < l; i++) {
int id = s[i] - 'A';
if(id < 0 || id >= 26) now = -1;
while(now != -1 && Next[now][id] == -1) now = fail[now];
now = now == -1 ? root : Next[now][id];
for(int p = now; p != -1; p = fail[p]) if(v[p]) {
num[v[p]]++;
}
}
for(int i = 1; i <= N; i++) if(num[i]) cout << s2[i] << ": " << num[i] << endl;
}
int main() {
ios::sync_with_stdio(false);
freopen("a.in", "r", stdin);
while(cin >> N) {
//初始化
L = 0; root = newnode();
memset(num, 0, sizeof(num));
for(int i = 1; i <= N; i++) {
cin >> s2[i];
insert(s2[i], i);
}
setfail();
string ss; cin >> ss;
query(ss);
}
return 0;
}
[kuangbin带你飞]专题17:C - 病毒侵袭持续中(HDU3065)
最新推荐文章于 2021-04-01 14:18:42 发布