[bzoj3172][Tjoi2013]单词
Description
某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次.
Input
第一个一个整数\(N\),表示有多少个单词.
接下来\(N\)行每行一个单词,每个单词由小写字母组成.
Output
输出\(N\)个整数,第\(i\)行的数字表示第\(i\)个单词在文章中出现了多少次.
Sample Input
3
a
aa
aaa
Sample Output
6
3
1
HINT
\(N\;\leq\;200\),单词总长度不超过\(10^6\)
Solution
\(AC\)自动机+\(fail\)树.
\(fail\)树中求子树和即可.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define M 26
#define K 205
#define N 1000005
using namespace std;
struct trie{
int chl[M],nxt,cnt;
}t[N];
struct graph{
int nxt,to;
}e[N];
int a[K],g[N],tot[N],n,m,cnt;
char c[N];
queue q;
inline void addedge(int x,int y){
e[++cnt].nxt=g[x];g[x]=cnt;e[cnt].to=y;
}
inline int insert(int u,int i){
++t[u].cnt;
if(i==m) return u;
int k=c[i]-'a';
if(!t[u].chl[k])
t[u].chl[k]=++cnt;
return insert(t[u].chl[k],i+1);
}
inline void get_nxt(){
for(int i=0;i