裸的AC自动机,没加优化,TLE 68pts ,题解也没看懂(我真的太蒟了)
求大佬们的回答
#include <bits/stdc++.h>
using namespace std;
int cnt, n;
string s[200010], ss;
struct tree {
int fail, vis[26];
vector<int> ends;
} ac[200010];
struct res {
int num, pos;
} ans[200010];
void clean(int x) {
memset(ac[x].vis, 0, sizeof(ac[x].vis));
ac[x].fail = 0;
ac[x].ends.clear();
}
void build(string s, int num) {
int l = s.size(), now = 0;
for (int i = 0; i < l; i++) {
int c = s[i] - 'a';
if (ac[now].vis[c] == 0) {
cnt++;
ac[now].vis[c] = cnt;
clean(cnt);
}
now = ac[now].vis[c];
}
ac[now].ends.push_back(num);
}
void bfs() {
queue<int> q;
for (int i = 0; i < 26; i++)
if (ac[0].vis[i] != 0) {
ac[ac[0].vis[i]].fail = 0;
q.push(ac[0].vis[i]);
}
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < 26; i++) {
int v = ac[u].vis[i];
if (v != 0) {
ac[v].fail = ac[ac[u].fail].vis[i];
q.push(v);
} else {
ac[u].vis[i] = ac[ac[u].fail].vis[i];
}
}
}
}
void query(string s) {
int l = s.size();
int now = 0;
for (int i = 0; i < l; i++) {
now = ac[now].vis[s[i] - 'a'];
for (int t = now; t; t = ac[t].fail) {
for (int id : ac[t].ends) {
ans[id].num++;
}
}
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n;
cnt = 0;
clean(0);
for (int i = 1; i <= n; i++) {
cin >> s[i];
ans[i].num = 0;
ans[i].pos = i;
build(s[i], i);
}
ac[0].fail = 0;
bfs();
cin >> ss;
query(ss);
for (int i = 1; i <= n; i++) {
cout << ans[i].num << "\n";
}
return 0;
}
谢谢啦~