BZOJ_3172_[TJOI2013]_单词_(AC自动机)
描述
http://www.lydsy.com/JudgeOnline/problem.php?id=3172
\(n\)个单词组成一篇文章,求每个单词在文章中出现的次数.
分析
这道题很像BZOJ_2434_[NOI2011]_阿狸的打字机_(AC自动机+dfs序+树状数组)
一个单词出现过,那么一定是某个单词的某个前缀的后缀,可以通过这个前缀的末尾沿着失配边找到它.我们要统计有多少点可以这样找到它.
建立fail树,很显然,单词\(x\)子树中的所有点都可以沿着失配边找到\(x\),这样我们只用记录每个点有多少次就行了.
(eg:如果文章是 a aa aaa,那么a有3次(三个单词各一次),aa有2次(第二个单词和第三个单词),aaa有1次(第三个单词)).
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e6+,type=;
int n,m;
char s[maxn];
struct Aho_Corasick{
int sz;
int q[maxn],val[maxn],pos[maxn],f[maxn];
int ch[maxn][type];
Aho_Corasick():sz(){memset(ch[],,sizeof ch[]);memset(val,,sizeof val);}
inline int insert(char *s){
int u=,m=strlen(s+);
for(int i=;i<=m;i++){
int c=s[i]-'a';
if(!ch[u][c]){
memset(ch[++sz],,sizeof ch[sz]); val[sz]=;
ch[u][c]=sz;
}
u=ch[u][c];
val[u]++;
}
return u;
}
inline void get_fail(){
int L=,R=;
for(int c=;c<type;c++){
int u=ch[][c];
if(u){f[u]=;q[++R]=u;}
}
while(L<=R){
int u=q[L++];
for(int c=;c<type;c++){
int t=ch[u][c];
if(!t){ch[u][c]=ch[f[u]][c];continue;}
int v=f[u];
f[t]=ch[v][c];
q[++R]=t;
}
}
for(int i=sz;i;i--) val[f[q[i]]]+=val[q[i]];
}
inline void solve(){
for(int i=;i<=n;i++) printf("%d\n",val[pos[i]]);
}
}ac;
inline void solve(){
ac.get_fail();
ac.solve();
}
inline void init(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%s",s+);
ac.pos[i]=ac.insert(s);
}
}
int main(){
init();
solve();
return ;
}
3172: [Tjoi2013]单词
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 2837 Solved: 1356
[Submit][Status][Discuss]
Description
某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。
Input
第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6
Output
输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。
Sample Input
a
aa
aaa
Sample Output
3
1
HINT
Source
BZOJ_3172_[TJOI2013]_单词_(AC自动机)的更多相关文章
- 【BZOJ3172】[TJOI2013] 单词(AC自动机的小应用)
点此看题面 大致题意: 给你\(N\)个单词,请你求出每一个单词在这\(N\)个单词中出现的次数. 相关题目 这道题应该是洛谷上一道板子题的升级版. \(AC\)自动机 这是一道\(AC\)自动机的简 ...
- 【BZOJ3172】单词(AC自动机)
[BZOJ3172]单词(AC自动机) 题面 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input ...
- 【洛谷】3966:[TJOI2013]单词【AC自动机】【fail树】
P3966 [TJOI2013]单词 题目描述 小张最近在忙毕设,所以一直在读论文.一篇论文是由许多单词组成但小张发现一个单词会在论文中出现很多次,他想知道每个单词分别在论文中出现了多少次. 输入输出 ...
- BZOJ3172 [Tjoi2013]单词 【AC自动机】
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 4293 Solved: 2083 [Submit][Stat ...
- 【bzoj3172】: [Tjoi2013]单词 字符串-AC自动机
[bzoj3172]: [Tjoi2013]单词 先用所有单词构造一个AC自动机 题目要求的是每个单词在这个AC自动机里匹配到的次数 每次insert一个单词的时候把路径上的cnt++ 那么点p-&g ...
- [BZOJ 3172] [Tjoi2013] 单词 【AC自动机】
题目链接:BZOJ - 3172 题目分析: 题目要求求出每个单词出现的次数,如果把每个单词都在AC自动机里直接跑一遍,复杂度会很高. 这里使用AC自动机的“副产品”——Fail树,Fail树的一个性 ...
- bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)
https://www.lydsy.com/JudgeOnline/problem.php?id=3172 构建AC自动机 在fail树上,点i的子树大小 表示trie树上根节点到i构成的单词 是 多 ...
- [BZOJ3172 ][Tjoi2013]单词(AC自动机)
Description 不稳定的传送门 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次.单词个数<=200,单词总长度< ...
- bzoj 3172: [Tjoi2013]单词【AC自动机】
一眼AC自动机,就是先把串建一个自动机,标记每个串在自动机上的位置,然后加上间隔符连成一个串在自动机上跑,每跑到一个点就说明这个串以及它到root的所有点表示的串都要被更新一次 先在点上打上标记,最后 ...
随机推荐
- NativeExcel 读取文件
class function T_EShopDataBill.ImportData(const AFileName: String; AList: T_EShopDataModelList; var ...
- CCNP第二天 帧中继综合实验
实验题如图所示: 要求全网可达 R5为帧中继交换机 R6 和 R1之间为快速以太网接口 所使用的拓扑为CCNA标准版拓扑图,如下所示: -------------------------------- ...
- Kakfa揭秘 Day1 Kafka原理内幕
Spark Streaming揭秘 Day32 Kafka原理内幕 今天开始,会有几天的时间,和大家研究下Kafka.在大数据处理体系中,kafka的重要性不亚于SparkStreaming.可以认为 ...
- 1009. Product of Polynomials (25)
#include <stdio.h> struct MyStruct { int exp; double coe; }; int main() { int k1,k2,i,j; MyStr ...
- wampserver安装后的基本配置
wampserver安装后的基本配置 1.WampServer的安装 下载好安装包后,你能在保存其文件夹中找到这样一个图标: 双击它,会弹出如下提示 提示信息:不要试图从Wamp5 1.x(x代表任意 ...
- oracle行转列、列转行
一.行转列 需要将如下格式 转换为: 这就是最常见的行转列,主要原理是利用decode函数.聚集函数(sum),结合group by分组实现的 create table test( id varcha ...
- aaaa
http://www.host.com http://www.host.com http://sz.weixun.com/scenery/details-3.htm http://sz.weixun. ...
- 微软Hololens设备 浅分析
微软Hololens的定位是一款MR 设备(Mixed reality).MR与AR的不同我认为是MR能够将真实环境的场景信息与虚拟对象进行完美的融合,它是基于SLAM(SimultaneousLoc ...
- bnuoj 20832 Calculating Yuan Fen(暴力模拟)
http://www.bnuoj.com/bnuoj/problem_show.php?pid=20832 [题意]: 给你一串字符串,求一个ST(0<ST<=10000),对字符串中字符 ...
- mysql语句中把string类型字段转datetime类型
mysql语句中把string类型字段转datetime类型 在mysql里面利用str_to_date()把字符串转换为日期 此处以表h_hotelcontext的Start_time和En ...