思路

SPOJ 1812 LCS2 - Longest Common Substring II一个思路,改成多组数据就有三倍经验了

代码

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. using namespace std;
  5. int maxlen[202000],suflink[202000],barrel[202000],trans[202000][26],Nodecnt,ranks[202000];
  6. int New_state(int _maxlen,int *_trans,int _suflink){
  7. ++Nodecnt;
  8. maxlen[Nodecnt]=_maxlen;
  9. if(_trans)
  10. for(int i=0;i<26;i++)
  11. trans[Nodecnt][i]=_trans[i];
  12. suflink[Nodecnt]=_suflink;
  13. return Nodecnt;
  14. }
  15. int add_len(int u,int c){
  16. int z=New_state(maxlen[u]+1,NULL,0);
  17. while(u&&trans[u][c]==0){
  18. trans[u][c]=z;
  19. u=suflink[u];
  20. }
  21. if(!u){
  22. suflink[z]=1;
  23. return z;
  24. }
  25. int v=trans[u][c];
  26. if(maxlen[v]==maxlen[u]+1){
  27. suflink[z]=v;
  28. return z;
  29. }
  30. int y=New_state(maxlen[u]+1,trans[v],suflink[v]);
  31. suflink[v]=suflink[z]=y;
  32. while(u&&trans[u][c]==v){
  33. trans[u][c]=y;
  34. u=suflink[u];
  35. }
  36. return z;
  37. }
  38. void c_sort(int n,int lim){
  39. memset(barrel,0,sizeof(barrel));
  40. for(int i=1;i<=n;i++)
  41. barrel[maxlen[i]]++;
  42. for(int i=1;i<=lim;i++)
  43. barrel[i]+=barrel[i-1];
  44. for(int i=1;i<=n;i++)
  45. ranks[barrel[maxlen[i]]--]=i;
  46. }
  47. int Ans[202000],mx[202000];
  48. char s[202000];
  49. void init(void){
  50. Nodecnt=1;
  51. memset(maxlen,0,sizeof(maxlen));
  52. memset(trans,0,sizeof(trans));
  53. memset(suflink,0,sizeof(suflink));
  54. memset(ranks,0,sizeof(ranks));
  55. memset(Ans,0,sizeof(Ans));
  56. memset(mx,0,sizeof(mx));
  57. }
  58. int main(){
  59. // freopen("test.in","r",stdin);
  60. int T;
  61. scanf("%d",&T);
  62. while(T--){
  63. init();
  64. int cnt=0,last=1,numx;
  65. Nodecnt=1;
  66. int len;
  67. scanf("%d",&numx);
  68. for(int i=1;i<=numx;i++){
  69. scanf("%s",s+1);
  70. ++cnt;
  71. len=strlen(s+1);
  72. if(cnt==1){
  73. for(int i=1;i<=len;i++)
  74. last=add_len(last,s[i]-'a');
  75. c_sort(Nodecnt,200010);
  76. for(int i=1;i<=Nodecnt;i++)
  77. Ans[i]=maxlen[i];
  78. }
  79. else{
  80. memset(mx,0,sizeof(mx));
  81. int nowp=1,lent=0;
  82. for(int i=1;i<=len;i++){
  83. if(trans[nowp][s[i]-'a']){
  84. lent++;
  85. nowp=trans[nowp][s[i]-'a'];
  86. }
  87. else{
  88. while(nowp&&trans[nowp][s[i]-'a']==0)
  89. nowp=suflink[nowp];
  90. if(!nowp){
  91. nowp=1;
  92. lent=0;
  93. continue;
  94. }
  95. else{
  96. lent=maxlen[nowp]+1;
  97. nowp=trans[nowp][s[i]-'a'];
  98. }
  99. }
  100. mx[nowp]=max(mx[nowp],lent);
  101. }
  102. for(int i=Nodecnt;i>=1;i--){
  103. int t=ranks[i];
  104. mx[suflink[t]]=max(mx[suflink[t]],mx[t]);
  105. }
  106. for(int i=1;i<=Nodecnt;i++)
  107. Ans[i]=min(Ans[i],mx[i]);
  108. }
  109. }
  110. int ans=0;
  111. for(int i=1;i<=Nodecnt;i++)
  112. ans=max(Ans[i],ans);
  113. printf("%d\n",ans);
  114. }
  115. return 0;
  116. }

SPOJ 10570 LONGCS - Longest Common Substring的更多相关文章

  1. SPOJ 1811 LCS - Longest Common Substring

    思路 和SPOJ 1812 LCS2 - Longest Common Substring II一个思路,改成两个串就有双倍经验了 代码 #include <cstdio> #includ ...

  2. spoj 1811 LCS - Longest Common Substring (后缀自己主动机)

    spoj 1811 LCS - Longest Common Substring 题意: 给出两个串S, T, 求最长公共子串. 限制: |S|, |T| <= 1e5 思路: dp O(n^2 ...

  3. spoj 1812 LCS2 - Longest Common Substring II (后缀自己主动机)

    spoj 1812 LCS2 - Longest Common Substring II 题意: 给出最多n个字符串A[1], ..., A[n], 求这n个字符串的最长公共子串. 限制: 1 < ...

  4. 【SPOJ】1812. Longest Common Substring II(后缀自动机)

    http://www.spoj.com/problems/LCS2/ 发现了我原来对sam的理解的一个坑233 本题容易看出就是将所有匹配长度记录在状态上然后取min后再对所有状态取max. 但是不要 ...

  5. 【刷题】SPOJ 1811 LCS - Longest Common Substring

    A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...

  6. 【刷题】SPOJ 1812 LCS2 - Longest Common Substring II

    A string is finite sequence of characters over a non-empty finite set Σ. In this problem, Σ is the s ...

  7. 【SPOJ 1812】Longest Common Substring II

    http://www.spoj.com/problems/LCS2/ 这道题想了好久. 做法是对第一个串建后缀自动机,然后用后面的串去匹配它,并在走过的状态上记录走到这个状态时的最长距离.每匹配完一个 ...

  8. 【spoj LCS2】 Longest Common Substring II

    http://www.spoj.com/problems/LCS2/ (题目链接) 题意 求多个串的最长公共子串 Solution 对其中一个串构造后缀自动机,然后其它串在上面跑匹配.对于每个串都可以 ...

  9. SPOJ 1812 LCS2 - Longest Common Substring II

    思路 后缀自动机求多串的最长公共子串 对第一个建出后缀自动机,其他的在SAM上匹配,更新到一个节点的匹配长度最大值即可,最后对所有最大值取min得到一个节点的答案,对所有节点答案求max即可 然后注意 ...

随机推荐

  1. 为什么vue里面data里面的对象,无法用delete删除属性

    因为vue里面的data是用get赋值的,所以无法用delete, 这时你可以用Object.defineProperty() Object.defineProperty(basic,'photo', ...

  2. 在Vuex更新,组件内的视图更新问题

    由于js的限制,vue无法进行监听数组; 当你利用索引直接设置一个项时,例如: vm.items[indexOfItem] = newValue 当你修改数组的长度时,例如: vm.items.len ...

  3. angular脚手架搭建

    下面以angular2.0为例前提已安装好node.js 1.安装cli执行如下命令npm install -g @angular/cli 2.创建新项目ng new my-app 3.然后到该项目目 ...

  4. python中字符串的拼接

    1.+ 号 2.format() 3.f"{username}登录成功" 4.%s 5.列表中的 join 6.逗号 http://www.cnblogs.com/gengcx/p ...

  5. Oracle debug

    执行慢的使用使用debug环境变量,可以收集详细的日志 rootcrs.pl/roothas.pl执行慢 参考如下文档设置debug环境变量,重现问题并收集详细日志. How to turn on r ...

  6. (转载)Oracle procedure 基本语法

    转自:http://www.cnblogs.com/wolfplan/p/4004624.html 关键字: oracle 存储过程 1.基本结构 CREATE OR REPLACE PROCEDUR ...

  7. win 下 python ImportError: No module named requests

    第一次弄爬虫,报库找不到,网上找了半天,一般都让都让改成绝对路径...那不是饮鸩止渴嘛. 然后 在无意中发现,不需要控制台输入pip命令,因为不是在Linux下啊,,win下直接在pycharm里添加 ...

  8. 2019微信浏览器跳转外部浏览器下载app打开任意站实现方法

    很多朋友问我怎么解决微信内点击链接或扫描二维码可以直接跳出微信在外部浏览器打开网页链接和下载APP,其实这并不难,只要我们实现微信跳转功能即可.下面给大家介绍这个功能 方案实现教程: 功能目的 生成微 ...

  9. 检测U盘插入、拨出状态

    头文件 #include <Dbt.h> 关键代码: LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LP ...

  10. Canvas Demo

    <!DOCTYPE html> <html> <head> <title>ゆき</title> </head> <styl ...