首页 > 其他 > 详细

[BZOJ]单词

时间:2018-08-17 10:39:18      阅读:133      评论:0      收藏:0      [点我收藏+]

Description

某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。

Input

第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6

Output

输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。

Sample Input

3
a
aa
aaa

Sample Output

6
3
1
 
很巧妙的运用了fail树。求一个fail树的子树和即可。
代码:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #define M 2000000
 6 using namespace std;
 7 struct point{
 8     int next,to;
 9 }e[M<<1];
10 int n,m,num,cnt;
11 int head[M],fail[M],sum[M],ans[M],end[M];
12 int ch[M][26];
13 char s[M];
14 void add(int from,int to)
15 {
16     e[++num].next=head[from];
17     e[num].to=to;
18     head[from]=num;
19 }
20 void insert(string s,int id)
21 {
22     int len=s.length();
23     int now=0;
24     for(int i=0;i<len;i++)
25     {
26         if(!ch[now][s[i]-a]) ch[now][s[i]-a]=++cnt;
27         now=ch[now][s[i]-a];
28         sum[now]++;
29     }
30     end[id]=now;
31 }
32 void build_fail()
33 {
34     queue<int>q;
35     for(int i=0;i<26;i++)
36         if(ch[0][i])
37         {
38             q.push(ch[0][i]);
39             add(0,ch[0][i]);
40         }
41     while(!q.empty())
42     {
43         int u=q.front(); q.pop();
44         for(int i=0;i<26;i++)
45         {
46             if(ch[u][i])
47             {
48                 fail[ch[u][i]]=ch[fail[u]][i];
49                 q.push(ch[u][i]);
50                 add(ch[fail[u]][i],ch[u][i]);
51             }
52             else ch[u][i]=ch[fail[u]][i];
53         }
54     }
55 }
56 void dfs(int x)
57 {
58     for(int i=head[x];i;i=e[i].next)
59     {
60         int to=e[i].to;
61         dfs(to);
62         sum[x]+=sum[to];
63     }
64 }
65 int main()
66 {
67     scanf("%d",&n);
68     for(int i=1;i<=n;i++)
69     {
70         scanf("%s",s);
71         insert(s,i);
72     }
73     build_fail();
74     dfs(0);;
75     for(int i=1;i<=n;i++) printf("%d\n",sum[end[i]]);
76     return 0;
77 }

 

[BZOJ]单词

原文:https://www.cnblogs.com/Slrslr/p/9491832.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!