单词统计 (AC自动机)
来源:互联网 发布:嵌入式linux裁剪 编辑:程序博客网 时间:2024/06/05 11:37
1118.单词统计Time Limit: 1000 MS Memory Limit: 32768 KB
Total Submission(s): 12 Accepted Submission(s): 1DescriptionSample Output
Total Submission(s): 12 Accepted Submission(s): 1Description
给定一个字符串和若干个单词,统计这些单词在这个字符串中出现的次数。
Input第一行为一个整数n(1 <= n <= 10000),表示单词的数量,之后n行每行一个单词,单词只由小写字母组成,最大长度为50。最后一行为一个字符串,也只由小写字母组成,最大长度1000000。
Output一行n个用一个空格隔开的整数,表示每个单词出现的次数。
Sample Input5aabbaabababaababa
4 2 2 2 1
#include<iostream>#include<stdio.h>#include<cstring>using namespace std;struct node{ node *fail; node *next[26]; int count; int count1; node() { fail=NULL; count=0; count1=0; memset(next,NULL,sizeof(next)); }}*q[500001];char keyword[51];char str[1000001];int head,tail;int num=0;int cnt[10001]={0};void insert(char *str,node *root){ node *p=root; int i=0,index; while(str[i]) { index=str[i]-'a'; if(p->next[index]==NULL) p->next[index]=new node(); p=p->next[index]; i++; } if(p->count==0) { p->count=1; p->count1=++num; } else cnt[++num]=-p->count1;}void build(node *root){ int i; root->fail=NULL; q[head++]=root; while(head!=tail) { node *temp=q[tail++]; node *p=NULL; for(i=0;i<26;i++) { if(temp->next[i]!=NULL) { if(temp==root) temp->next[i]->fail=root; else { p=temp->fail; while(p!=NULL) { if(p->next[i]!=NULL) { temp->next[i]->fail=p->next[i]; break; } p=p->fail; } if(p==NULL) temp->next[i]->fail=root; } q[head++]=temp->next[i]; } } }} int query(node *root){ int i=0,index; node *p=root; while(str[i]) { index=str[i]-'a'; while(p->next[index]==NULL&&p!=root) p=p->fail; p=p->next[index]; p=(p==NULL)?root:p; node *temp=p; while(temp!=root) { if(temp->count!=0) cnt[temp->count1]+=temp->count; temp=temp->fail; } i++; } return 0;}int main(){ int n; head=tail=0; node *root=new node; scanf("%d",&n); while(n--) { scanf("%s",keyword); insert(keyword,root); } build(root); scanf("%s",str); query(root); for(int i=1;i<=num;i++) if(cnt[i]<0) cnt[i]=cnt[-cnt[i]]; for(int i=1;i<num;i++) printf("%d ",cnt[i]); printf("%d",cnt[num]); return 0;}
- 单词统计 (AC自动机)
- 【AC自动机】统计单词出现个数
- 【AC自动机】统计单词出现个数-map版
- 【AC自动机】统计单词出现个数-数据增强修改
- bzoj3172 单词 AC自动机
- bzoj3172.单词(AC自动机)
- [bzoj3172][AC自动机]单词
- [BZOJ3172]TJOI2013单词|AC自动机
- 【bzoj3172】【TJOI2013】【单词】【AC自动机】
- BZOJ_P3172 [Tjoi2013]单词(AC自动机)
- 【BZOJ3172】单词,AC自动机练习
- [BZOJ3172] [TJOI2013] 单词 - AC自动机
- bzoj 3172 单词 AC自动机
- [BZOJ3172][TJOI2013]单词-AC自动机
- BZOJ3172 [Tjoi2013]单词 【AC自动机】
- 数单词 (AC自动机模板题)
- BZOJ 3172 TJOI 2013 单词 AC自动机
- 【BZOJ】【P3172】【Tjoi2013】【单词】【题解】【AC自动机】
- 年度盛宴:2012年最佳25个响应式网站设计作品《下篇》
- poj_1716Integer Intervals
- 年轻人必须思考的4 大问题
- lipcap 小程序
- Respond.js – 让不懂爱的 IE6
- 单词统计 (AC自动机)
- HTTP方法 get和post区别
- Linux行走(3)——input子系统例子
- SQL Server死锁总结
- poj_1528 Perfection
- 采用Div+Css布局——牛腩
- Web App和Native App 谁将是未来
- Solr快速回顾1---Solr使用指南
- cnblogs博文浏览[推荐、Top、评论、关注、收藏]利器代码片段