题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946

对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走到哪些点了;只要有一个自动机上走不下去了,就都走不下去了。每走到一个新地方就更新一下 ans 。

或者像网上的其他题解一样,对一个串建一个后缀自动机,其他串跑一遍并在 parent 树上更新了之后得知自动机的每个点在当前串上能匹配的长度,最后对自动机上每个点的答案取 max 。不过没写这个。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=,M=N<<,K=,tN=;
  6. char s[N]; int T,lst,cnt,go[tN][M][K],fa[tN][M],l[tN][M],p[M][tN],ans;
  7. int Mx(int a,int b){return a>b?a:b;}
  8. void add(int x,int w)
  9. {
  10. int p=lst,np=++cnt;lst=np;l[x][np]=l[x][p]+;
  11. for(;p&&!go[x][p][w];p=fa[x][p])go[x][p][w]=np;
  12. if(!p)fa[x][np]=;
  13. else
  14. {
  15. int q=go[x][p][w];
  16. if(l[x][q]==l[x][p]+)fa[x][np]=q;
  17. else
  18. {
  19. int nq=++cnt;l[x][nq]=l[x][p]+;
  20. fa[x][nq]=fa[x][q];fa[x][q]=nq;fa[x][np]=nq;
  21. memcpy(go[x][nq],go[x][q],sizeof go[x][q]);
  22. for(;go[x][p][w]==q;p=fa[x][p])go[x][p][w]=nq;
  23. }
  24. }
  25. }
  26. void dfs(int cr,int len)
  27. {
  28. ans=Mx(ans,len);//
  29. for(int w=;w<=;w++)
  30. if(go[][cr][w])
  31. {
  32. bool flag=; int d=go[][cr][w];
  33. for(int t=;t<=T;t++)
  34. if(!go[t][p[cr][t]][w]){flag=;break;}
  35. else p[d][t]=go[t][p[cr][t]][w];
  36. if(!flag)continue;
  37. dfs(d,len+);
  38. }
  39. }
  40. int main()
  41. {
  42. scanf("%d",&T);
  43. for(int t=;t<=T;t++)
  44. {
  45. scanf("%s",s);int d=strlen(s);
  46. lst=cnt=;
  47. for(int i=;i<d;i++)add(t,s[i]-'a'+);
  48. }
  49. for(int t=;t<=T;t++)p[][t]=;
  50. dfs(,); printf("%d\n",ans);
  51. return ;
  52. }

bzoj 2946 [Poi2000]公共串——后缀自动机的更多相关文章

  1. BZOJ 2946: [Poi2000]公共串( 后缀自动机 )

    一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...

  2. BZOJ 2946 [Poi2000]公共串 ——后缀自动机

    任意选择一个串作为模式串,构建出后缀自动机. 然后用其他的串在后缀自动机上跑匹配. 然后就到了理解后缀自动机性质的时候. 在某一个节点的最大值是可以沿着parent树上传的. 然后用dp[i][j]表 ...

  3. BZOJ 2946 POI2000 公共串 后缀自动机(多串最长公共子串)

    题意概述:给出N个字符串,每个串的长度<=2000(雾...可能是当年的年代太久远机子太差了),问这N个字符串的最长公共子串长度为多少.(N<=5) 抛开数据结构,先想想朴素做法. 设计一 ...

  4. BZOJ 2946: [Poi2000]公共串

    2946: [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 342[Submit][Status][D ...

  5. 【bzoj2946】[Poi2000]公共串 后缀自动机

    [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1386  Solved: 620[Submit][Status][Discus ...

  6. BZOJ 2946 [Poi2000]公共串 (二分+Hash/二分+后缀数组/后缀自动机)

    求多串的最长公共字串. 法1: 二分长度+hash 传送门 法2: 二分+后缀数组 传送门 法3: 后缀自动机 拿第一个串建自动机,然后用其他串在上面匹配.每次求出SAM上每个节点的最长匹配长度后,再 ...

  7. BZOJ2946 [Poi2000]公共串(后缀自动机)

    Description          给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l        读入单词 l        计算最长公共子串的长度 l        输 ...

  8. bzoj 2946: [Poi2000]公共串【SAM】

    对第一个串建SAM,把剩下的串在上面跑,每次跑一个串的时候在SAM的端点上记录匹配到这的最大长度,然后对这些串跑的结果取min,然后从这些节点的min中取max就是答案 注意在一个点更新后它的祖先也会 ...

  9. 【BZOJ 2946】 2946: [Poi2000]公共串 (SAM)

    2946: [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1063  Solved: 469 Description      ...

随机推荐

  1. 《Maven实战》第6章 仓库

    6.1什么是Maven仓库? Maven仓库:存储所有Maven项目共享的构件的统一位置. Maven仓库的作用:Maven项目仅需声明依赖坐标,即可在需要的时候自动根据坐标找到仓库中的构件. 6.2 ...

  2. Spring Boot 中全局异常处理器

    Spring Boot 中全局异常处理器,就是把错误异常统一处理的方法.等价于Springmvc中的异常处理器. 步骤一:基于前面的springBoot入门小demo修改 步骤二:修改HelloCon ...

  3. struts2——文件下载自定义文件名,包括中文

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  4. Word Search, 在矩阵中寻找字符串,回溯算法

    问题描述: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed ...

  5. hdu 5719 Arrange 贪心

    Arrange Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Proble ...

  6. Java实现简单网页抓取

    需求说明:使用Java抓取网页信息,并以字符串的形式返回. 使用Java代码实现: package net.ibuluo.spider.util; import java.io.IOException ...

  7. spring3: Bean的命名与Bean的实例化

    http://jinnianshilongnian.iteye.com/blog/1413857 2.3.1  XML配置的结构 一般配置文件结构如下: <beans> <impor ...

  8. Confluence 6 配置系统属性

    在这个页面中描述 Confluence 启动时如何设置 Java 属性和其他选项. 请查看 How to fix out of memory errors by increasing availabl ...

  9. urllib.urlretrieve远程下载

    下面我们再来看看 urllib 模块提供的 urlretrieve() 函数.urlretrieve() 方法直接将远程数据下载到本地. >>> help(urllib.urlret ...

  10. Linux系列—策略路由、ip rule、ip route

    早期在管理Linux系统的网络时,常使用ifconfig及route之类的命令,不过如果你准备开始使用Linux强大的基于策略的路由机制,那么,就请不要使用这类工具了,因为这类工具根本无法用于功能强大 ...