[BZOJ3172 ][Tjoi2013]单词(AC自动机)
Description
某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。
单词个数<=200,单词总长度<=10^6
Solution
AC自动机的入门题,将所有单词建一颗字典树,并构造fail树
然后随便统计一下数量就可以了
Code
#include <cstdio>
#include <algorithm>
#include <cstring>
#define R register
#define N 1000002
using namespace std; char s[N];
int n,T[N][27],fail[N],e[N][2],head[N],q[N],tot,h,t,num=1,wr[201]; inline void Insert(int k){
int len=strlen(s);
for(R int now=1,i=0;i<len;++i){
if(T[now][s[i]-96]==0) T[now][s[i]-96]=++num;
now=T[now][s[i]-96];
T[now][0]++;
if(i==len-1) wr[k]=now;
}
} inline void Link(int u,int v){
e[++tot][0]=v,e[tot][1]=head[u],head[u]=tot;
} inline void getfail(){
int k,now;
h=0,t=1;q[1]=1;
while(h<t){
now=q[++h];
for(R int i=1;i<=26;++i)
if(T[now][i]!=0){
k=fail[now];
while(k!=0&&T[k][i]==0) k=fail[k];
if(T[k][i]!=0) fail[T[now][i]]=T[k][i];
else fail[T[now][i]]=1;
Link(fail[T[now][i]],T[now][i]);
q[++t]=T[now][i];
}
}
} inline int calc(int k){
for(R int j=head[k];j;j=e[j][1]){
T[k][0]+=calc(e[j][0]);
}
return T[k][0];
} int main(){
scanf("%d",&n);
T[1][0]=1;
for(R int i=1;i<=n;++i){
scanf("%s",s);
Insert(i);
}
getfail();
calc(1);
for(R int i=1;i<=n;++i) printf("%d\n",T[wr[i]][0]);
return 0;
}
Solution
[BZOJ3172 ][Tjoi2013]单词(AC自动机)的更多相关文章
- BZOJ3172[Tjoi2013]单词——AC自动机(fail树)
题目描述 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个 ...
- bzoj3172: [Tjoi2013]单词 ac自动机
某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词 ...
- 【BZOJ3172】[Tjoi2013]单词 AC自动机
[BZOJ3172][Tjoi2013]单词 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
- bzoj 3172: [Tjoi2013]单词 AC自动机
3172: [Tjoi2013]单词 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- 【BZOJ-3172】单词 AC自动机
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 2567 Solved: 1200[Submit][Status ...
- 洛谷P3966 [TJOI2013]单词(AC自动机)
题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出格式 输入格式: 第一行一个整数N,表 ...
- [TJOI2013]单词 AC自动机
题面: 洛谷 题解: 很久之前做的题了,只不过之前一直90....最近才发现是哪里写错了. 我们对字符集建AC自动机. 首先考虑一个暴力的做法,把文章当做一个长串,直接在自动机上跳,但是我们会发现,这 ...
- [TJOI2013]单词 AC 自动机
题目描述: 小张最近在忙毕设,所以一直在读论文. 一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 题解: AC 自动机裸题,将所有字符串读入 ...
- 【BZOJ 3172】[Tjoi2013]单词 AC自动机
关于AC自动机:一个在kmp与Trie的基础上建立的数据结构,关键在于Trie树结构与fail指针,他们各有各的应用.在AC自动机里最典型的就是多串匹配,原本效率为O(n*l+n*l+m*l),(n是 ...
随机推荐
- CentOS 上安装 GIT 服务
获取 YUM 中 GIT 信息: yum info git 查看当前 GIT 的版本: git --version 或 git version 卸载当前版本的 GIT: ...
- linux文件按照行数切割
公司小站的nginx服务器日志一直没有管理 到发现的时候已经有50G+的logs文件 查看起来十分不便 只能将其切割 接下来分享 具体方法 split -l 5000(行数) -a 5(增加文件名上限 ...
- PCB仿真软件与电磁场求解器的算法
1. 简介 目前商业化的PCB仿真软件主要有: Cadence公司的Sigrity.Ansys公司的SIwave/HFSS.CST公司的CST.Mentor公司的HyperLynx.Polor公司的S ...
- sharepoint知识点总结
{ users.Add(value.User); } else { SPGroup group = web.Groups.GetByID(value.LookupId); groups.Add(gro ...
- (原创)北美信用卡(Credit Card)个人使用心得与总结(个人理财版) [精华]
http://forum.chasedream.com/thread-766972-1-1.html 本人2010年 8月F1 二度来美,现在credit score 在724-728之间浮动,最高的 ...
- CRM WebClient UI里的文件是如何上传到Netweaver后台的
使用Chrome开发者工具调试CRM WebClient UI里附件上传的功能: 从本地选择一个文件,断点触发: 前端取得用户选中上传的文件名: Jerry.txt 点Attach按钮后,触发ABAP ...
- Last_Errno: 1396
Last_Errno: 1396 Last_Error: Error 'Operation CREATE USER failed for 'usera63'@'%'' on query. Defa ...
- 判断团队适不适合使用node
1.要不要用 2.历史包袱 3.跟进升级 看完scott创业公司使用node,对于一个团队要不要使用node,第一个就是如果承接的项目有很多历史迭代,线上也在稳定的抛,不要轻易的替换,比如很多老代码, ...
- 将一个命令的输出保存到CSV文件
执行段: 结果段: 补充:配合不同的命令可以使工作更加简单 使用Imort-Csv命令从文件中导入结构化数据
- Windows 7下的ARP
关于Windows 7和Windows XP下的ARP绑定的不同之处网络上已经很多,没空就不多说,注意用这样的方式绑定的arp项是动态的,动态的意思就是这个项不受任何保护,Windows想什么时候更改 ...