【bzoj 3172】【codevs 2542】[Tjoi2013]单词(AC自动机)
来源:互联网 发布:道路工程预算软件 编辑:程序博客网 时间:2024/04/30 21:11
3172: [Tjoi2013]单词
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3024 Solved: 1441
[Submit][Status][Discuss]
Description
某人读论文,一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。
Input
第一个一个整数N,表示有多少个单词,接下来N行每行一个单词。每个单词由小写字母组成,N<=200,单词长度不超过10^6
Output
输出N个整数,第i行的数字表示第i个单词在文章中出现了多少次。
Sample Input
3
a
aa
aaa
a
aa
aaa
Sample Output
6
3
1
3
1
HINT
Source
【题解】【AC自动机】
【类似于“病毒持续侵袭中”,也要记录单词的出现位置和结束位置,但不能在最后查找,因为单词出现的次数是从它出现的位置开始算起,即所有单词合成的这篇文章中,处于当前单词之前可能还合成了当前单词,但不计入最后结果】
#include<queue>#include<vector>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;vector<int>loc,order;int n,nxt[1000010][30],fail[1000010],sum[1000010],tot;bool vis[1000010];inline void clean(){memset(sum,0,sizeof(sum));memset(fail,0,sizeof(fail));memset(nxt,0,sizeof(nxt));memset(vis,false,sizeof(vis));tot=0;loc.clear(); order.clear(); return; } inline void insert(char c[]){int len=strlen(c);int now=0,i;for (i=0;i<len;++i) { int x=c[i]-'a'; if (!nxt[now][x]) nxt[now][x]=++tot; sum[nxt[now][x]]++; now=nxt[now][x]; }vis[now]=true;//标记以当前点为结尾的单词出现过 loc.push_back(now);//标记结尾 return;}inline void buildfail(){queue<int>que; int i,j;for(i=0;i<26;++i) if (nxt[0][i]) que.push(nxt[0][i]);while (!que.empty()) { int now=que.front(); que.pop(); order.push_back(now);//把当前出现的单词存起来 for (i=0;i<26;++i) { if (!nxt[now][i]) {nxt[now][i]=nxt[fail[now]][i]; continue;} int x=nxt[now][i]; fail[x]=nxt[fail[now]][i];//fail里存到当前字母为止的单词的最长后缀 que.push(x);//将更新出来的单词存入队列(存的是序号) } } return;}inline void find(){ for (int i=order.size()-1;i>=0;--i) sum[fail[order[i]]]+=sum[order[i]]; for (int i=0;i<n;++i) printf("%d\n",sum[loc[i]]); return;}int main(){int i,j;clean();scanf("%d",&n);for (i=0;i<n;++i) { char s1[1000010]; scanf("%s",s1); insert(s1); }buildfail();find();return 0;}
0 0
- 【bzoj 3172】【codevs 2542】[Tjoi2013]单词(AC自动机)
- [BZOJ 3172][Tjoi2013]单词(AC自动机)
- BZOJ 3172 [Tjoi2013] 单词 [AC自动机模板]
- 【BZOJ 3172】[Tjoi2013]单词 Ac自动机
- [BZOJ]3172: [Tjoi2013]单词 AC自动机
- BZOJ 3172: [Tjoi2013]单词 AC自动机/后缀自动机
- [AC自动机][fail树][BZOJ 3172][TJOI2013]单词
- BZOJ 3172 [Tjoi2013]单词 AC自动机(fail树)
- [AC自动机 fail树 || 后缀数组] BZOJ 3172 [Tjoi2013]单词
- BZOJ 3172 [Tjoi2013]单词 AC自动机 模板题
- 【BZOJ】【P3172】【Tjoi2013】【单词】【题解】【AC自动机】
- bzoj 3172 [Tjoi2013]单词 后缀自动机
- [BZOJ3172]TJOI2013单词|AC自动机
- 【bzoj3172】【TJOI2013】【单词】【AC自动机】
- BZOJ_P3172 [Tjoi2013]单词(AC自动机)
- [BZOJ3172] [TJOI2013] 单词 - AC自动机
- [BZOJ3172][TJOI2013]单词-AC自动机
- BZOJ3172 [Tjoi2013]单词 【AC自动机】
- 删除单链表中第k个节点
- Leetcode-416. Partition Equal Subset Sum
- Android架构蓝图------MVP
- 旅游攻略
- 什么叫过滤器呢?
- 【bzoj 3172】【codevs 2542】[Tjoi2013]单词(AC自动机)
- linux菜鸟入门之压缩以及归档
- laravel开发环境homestead搭建
- CSS 入门 笔记
- 阿里云配置tomcat
- HDU 4725 最短路
- NoSQL_Cassandra_导出数据库结构/数据库结构还原
- Swift3.0学习笔记----遍历字符串
- JS-数据类型