传送门

做了这么多题怎么还是无法很好的理解AC自动机呢..果然是个制杖

首先题意表述不是很清晰,这些所有的单词组成了那个文章,所以果断建个AC自动机,建的时候给每个点附加一个权值,建树是经过一次权值即+1。

然后根据建立fail的轨迹,其实就是Trie树的bfs序。根据这个逆序。对于每个点fail指向的点,把那个店的权值累加上当前点的权值。然后输出就行了。

建树的时候初始累加的权值也就是整篇文章有多少个独立的单词,然后每个fail指针指向词一定是在当前的词里出现过。所以就把被指向的点的权值加上当前点的权值。

  1. //BZOJ 3172
  2. //by Cydiater
  3. //2016.10.21
  4. #include <iostream>
  5. #include <cstring>
  6. #include <string>
  7. #include <algorithm>
  8. #include <queue>
  9. #include <map>
  10. #include <ctime>
  11. #include <cmath>
  12. #include <iomanip>
  13. #include <cstdlib>
  14. #include <cstdio>
  15. using namespace std;
  16. #define ll long long
  17. #define up(i,j,n) for(int i=j;i<=n;i++)
  18. #define down(i,j,n) for(int i=j;i>=n;i--)
  19. const int MAXN=1e6+5;
  20. const int oo=0x3f3f3f3f;
  21. inline int read(){
  22. char ch=getchar();int x=0,f=1;
  23. while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
  24. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  25. return x*f;
  26. }
  27. char s[MAXN];
  28. int sum[MAXN],next[MAXN][26],fail[MAXN],N,LEN,cnt=0,now,end[MAXN],q[MAXN],head,tail;
  29. namespace solution{
  30. void insert(){
  31. now=0;
  32. up(i,1,LEN){
  33. if(!next[now][s[i]-'a'])next[now][s[i]-'a']=++cnt;
  34. now=next[now][s[i]-'a'];sum[now]++;
  35. }
  36. }
  37. void init(){
  38. N=read();
  39. up(i,1,N){
  40. scanf("%s",s+1);
  41. LEN=strlen(s+1);
  42. insert();end[i]=now;
  43. }
  44. }
  45. void buildAC(){
  46. head=1;tail=0;up(i,0,25)if(next[0][i])q[++tail]=next[0][i];
  47. for(;head<=tail;head++){
  48. int node=q[head];
  49. up(i,0,25){
  50. int son=next[node][i];
  51. if(!son)next[node][i]=next[fail[node]][i];
  52. else{
  53. fail[son]=next[fail[node]][i];
  54. q[++tail]=son;
  55. }
  56. }
  57. }
  58. }
  59. void slove(){
  60. down(head,tail,1)sum[fail[q[head]]]+=sum[q[head]];
  61. }
  62. void output(){
  63. up(i,1,N)printf("%d\n",sum[end[i]]);
  64. }
  65. }
  66. int main(){
  67. //freopen("input.in","r",stdin);
  68. using namespace solution;
  69. init();
  70. buildAC();
  71. slove();
  72. output();
  73. return 0;
  74. }

BZOJ3172: [Tjoi2013]单词的更多相关文章

  1. BZOJ3172 [Tjoi2013]单词 【AC自动机】

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MB Submit: 4293  Solved: 2083 [Submit][Stat ...

  2. [Bzoj3172][Tjoi2013]单词(fail树)

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 4777  Solved: 2345[Submit][Status ...

  3. BZOJ3172 [Tjoi2013]单词 字符串 SA ST表

    原文链接http://www.cnblogs.com/zhouzhendong/p/9026543.html 题目传送门 - BZOJ3172 题意 输入$n(n\leq 200)$个字符串,保证长度 ...

  4. BZOJ3172——[Tjoi2013]单词

    1. 题目大意:一篇论文是由许多单词组成,现在想知道每个单词分别在论文中出现多少次. 2.分析:对着 广义后缀自动机的图看,我们就会发现玄机,答案不就是这个单词下的后缀个数吗? 于是建立自动机,然后求 ...

  5. bzoj千题计划315:bzoj3172: [Tjoi2013]单词(AC自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3172 构建AC自动机 在fail树上,点i的子树大小 表示trie树上根节点到i构成的单词 是 多 ...

  6. BZOJ3172[Tjoi2013]单词——AC自动机(fail树)

    题目描述 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. 输入 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个 ...

  7. bzoj3172: [Tjoi2013]单词 ac自动机

    某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整数N,表示有多少个单词,接下来N行每行一个单词.每个单词 ...

  8. [BZOJ3172 ][Tjoi2013]单词(AC自动机)

    Description 不稳定的传送门 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次.单词个数<=200,单词总长度< ...

  9. 【AC自动机】bzoj3172: [Tjoi2013]单词

    fail图上后缀和需要注意一下 Description 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次. Input 第一个一个整 ...

随机推荐

  1. jQuery对表格的操作及其他应用

    表格操作 1.隔行变色:对普通表格进行隔行换色:单击显示高亮样式:复选框选中高亮 <!DOCTYPE html> <html> <head> <meta ht ...

  2. DBCC CheckDB遇到a database snapshot could not be created

    在备份一个客户的数据库时(数据库版本为SQL 2005 Express版本),做DBCC CHECKDB时遇到了下面错误信息: dbcc checkdb('DB_NAME'); 消息 5030,级别 ...

  3. .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  4. The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path解决方案

    0.环境: win7系统,Tomcat9配置无误. 1.错误: 项目中某一.jps页面忽然出现错误,鼠标点上去为:The superclass "javax.servlet.http.Htt ...

  5. Centos 安装jdk1.8

    我是根据右边链接进行安装的 ,但是第一步不同噢.http://www.cnblogs.com/spiders/archive/2016/09/06/5845727.html 1.下载rpm安装文件. ...

  6. jQuery validator自定义

    项目中接触到validator,记录下 jQuery.validator.addMethod("isStrongPwd", function(value, element){ va ...

  7. php函数 ceil floor round和 intval

    1.ceil 如果有小数部分 则进一位 < ?php echo ceil(4.3); echo ceil(9.999); ?> 2.floor 舍小取整 < ? php echo f ...

  8. 【2016-11-7】【坚持学习】【Day22】【C# 委托的应用】

    我觉得我对委托的概念还没有完全掌握,于是,我需要继续思考,学习它的应用实现.

  9. BZOJ3223: Tyvj 1729 文艺平衡树 [splay]

    3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3595  Solved: 2029[Submit][Sta ...

  10. [tem]RMQ(st)

    倍增思想 代码中有两个测试 #include <iostream> #include <cmath> using namespace std; const int N=1e5; ...