BZOJ 3172: [Tjoi2013]单词(fail树)
来源:互联网 发布:手机淘宝支付宝登录 编辑:程序博客网 时间:2024/04/27 17:30
题意:
一篇论文是由许多单词组成。但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次。
思路:
ac自动机的本质如果一个串是另外一个串的子串,那么这个串是另外一个串的前缀的后缀,即另外一个串通过不停地fail指针可以移动
到这个串的末尾知道了这个理论,那么其实fail指针就是一棵树,求这个串总共出现多少次->这个节点的子树的大小(通过循环传递可以直接求出)
#include<bits/stdc++.h>using namespace std;char s[1150010];int ed[1000010],q[1000010];struct Trie{ int sz,val[1000010],next[1000010][26],fail[1000010],root; int newnode(){ memset(next[sz],-1,sizeof(next[sz])); val[sz]=0,sz++; return sz-1; } void init(){ sz=0; root=newnode(); } void insert(int st,int ed,int &pos){ int now=root; for(int i=st;i<ed;i++){ if(next[now][s[i]-'a']==-1) next[now][s[i]-'a']=newnode(); now=next[now][s[i]-'a']; val[now]++; } pos=now; } void build(){ int head=0,tail=0; fail[root]=root; for(int i=0;i<26;i++) if(next[root][i]!=-1) fail[next[root][i]]=root,q[++tail]=next[root][i]; while(head<tail){ int now=q[++head]; for(int i=0;i<26;i++){ if(next[now][i]!=-1){ int k=fail[now]; while(k!=root&&next[k][i]==-1) k=fail[k]; if(next[k][i]!=-1) k=next[k][i]; fail[next[now][i]]=k; q[++tail]=next[now][i]; } } } for(int i=tail;i>=1;i--) val[fail[q[i]]]+=val[q[i]]; }};Trie ac;int len[1000];int main(){ ac.init(); int n; scanf("%d",&n); len[0]=0; for(int i=1;i<=n;i++){ scanf("%s",s+len[i-1]); len[i]=strlen(s); ac.insert(len[i-1],len[i],ed[i]); } ac.build(); for(int i=1;i<=n;i++) printf("%d\n",ac.val[ed[i]]); return 0;}
0 0
- BZOJ 3172 Tjoi2013 单词 fail树
- BZOJ 3172: [Tjoi2013]单词(fail树)
- BZOJ 3172 [Tjoi2013] 单词 Fail树
- Bzoj 3172: [Tjoi2013]单词(fail树)
- fail树(bzoj 3172: [Tjoi2013]单词)
- [AC自动机][fail树][BZOJ 3172][TJOI2013]单词
- BZOJ 3172 [Tjoi2013]单词 AC自动机(fail树)
- [AC自动机 fail树 || 后缀数组] BZOJ 3172 [Tjoi2013]单词
- 3172: [Tjoi2013]单词 fail树
- 【BZOJ 3172】 [Tjoi2013]单词
- bzoj 3172: [Tjoi2013]单词
- BZOJ 3172 【Tjoi2013】单词
- bzoj 3172 [Tjoi2013]单词
- BZOJ 3172 [Tjoi2013]单词
- 【bzoj3172】[Tjoi2013]单词 AC自动机+fail树
- BZOJ3172 & 洛谷3966 [Tjoi2013]单词 【fail树】
- BZOJ 题目3172: [Tjoi2013]单词(AC自动机||AC自动机+fail树||后缀数组暴力||后缀数组+RMQ+二分等五种姿势水过)
- BZOJ 3172 Tjoi2013 单词 后缀数组
- Android Studio如何安装插件
- SimpleDateFormat 将时间变成:年月日时分秒
- angular.bootstrap详解
- 有容云-PPT | 当微服务遇见容器
- SpringMVC之HttpMessageConverter
- BZOJ 3172: [Tjoi2013]单词(fail树)
- PHP程序守护进程化
- SpringMVC路径匹配规则AntPathMatcher
- Unity 之 C# 利用回调函数实现C++匿名函数
- java 日期格式化-- SimpleDateFormat 的使用
- Android的ToggleButton实现开关按钮
- ajax,json,php使用实例
- 1
- C++ 类访问控制public/private/protected探讨