给出 n 个单词,询问每个单词 i(i>=1 && i <= n), 在 n 个单词中出现的次数是多少?
思路
建立 ac 自动机,
代码
#include<bits/stdc++.h>
using namespace std;constint N =3e6+5;char s[N];int tr[N][26], ne[N], idx;int f[N], id[N];
vector<int> v;voidinsert(int x){int p =0;for(int i =0; s[i]; i ++){int c = s[i]-'a';if(tr[p][c]==0) tr[p][c]=++ idx;
p = tr[p][c];
f[p]++;}
id[x]= p;}voidbuild(){int p =0;
queue<int> q;for(int i =0; i <26; i ++){if(tr[p][i]) q.push(tr[p][i]);}while(q.size()){
p = q.front(); q.pop();
v.push_back(p);for(int i =0; i <26; i ++){int& t = tr[p][i];if(! t) t = tr[ne[p]][i];else{
ne[t]= tr[ne[p]][i];
q.push(t);}}}}intmain(){int n;scanf("%d",&n);for(int i =1; i <= n; i ++){scanf("%s", s);insert(i);}build();for(int i = v.size()-1; i >=0; i --) f[ne[v[i]]]+= f[v[i]];for(int i =1; i <= n; i ++)printf("%d\n", f[id[i]]);return0;}
题目链接题意给出 n 个单词,询问每个单词 i(i>=1 && i <= n), 在 n 个单词中出现的次数是多少?思路建立 ac 自动机,代码#include <bits/stdc++.h>using namespace std;const int N = 3e6 + 5;char s[N];int tr[N][26], ne[N], idx;int f[N], id[N];vector<int> v;void i