题解:

后缀数组

把所有串连接起来

二分答案

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. const int N=;
  6. typedef long long ll;
  7. using namespace std;
  8. char ch[N];
  9. int str[N],l[N],mx[N],mn[N],in[N],k,wa[N],wb[N],wv[N],Ws[N],sa[N],Rank[N],height[N];
  10. int cmp(int *r,int a,int b,int l)
  11. {
  12. return r[a]==r[b]&&r[a+l]==r[b+l];
  13. }
  14. void da(const int *r,int *sa,int n,int m)
  15. {
  16. int *x=wa,*y=wb;
  17. for (int i=;i<m;i++) Ws[i]=;
  18. for (int i=;i<n;i++) Ws[x[i]=r[i]]++;
  19. for (int i=;i<m;i++) Ws[i]+=Ws[i-];
  20. for (int i=n-;i>=;i--) sa[--Ws[x[i]]]=i;
  21. for (int j=,p=;p<n;j*=,m=p)
  22. {
  23. p=;
  24. for (int i=n-j;i<n;i++) y[p++]=i;
  25. for (int i=;i<n;i++)
  26. if (sa[i]>=j) y[p++]=sa[i]-j;
  27. for (int i=;i<n;i++) wv[i]=x[y[i]];
  28. for (int i=;i<m;i++) Ws[i]=;
  29. for (int i=;i<n;i++) Ws[wv[i]]++;
  30. for (int i=;i<m;i++) Ws[i]+=Ws[i-];
  31. for (int i=n-;i>=;i--) sa[--Ws[wv[i]]]=y[i];
  32. swap(x,y);p=;x[sa[]]=;
  33. for (int i=;i<n;i++)x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
  34. }
  35. }
  36. void calheight(const int *r,int *sa,int n)
  37. {
  38. int j,k=;
  39. for (int i=;i<=n;i++) Rank[sa[i]]=i;
  40. for (int i=;i<n;height[Rank[i++]]=k)
  41. for (k?k--:,j=sa[Rank[i]-];r[i+k]==r[j+k];k++);
  42. }
  43. int pd(int mid,int n)
  44. {
  45. for (int i=;i<k;i++){mx[i]=;mn[i]=1e9;}
  46. for (int i=;i<=n;i++)
  47. {
  48. if (height[i]<mid)
  49. {
  50. for (int j=;j<k;j++)
  51. {
  52. mx[j]=;
  53. mn[j]=1e9;
  54. }
  55. mx[in[sa[i]]]=sa[i];
  56. mn[in[sa[i]]]=sa[i];
  57. }
  58. else
  59. {
  60. mx[in[sa[i]]]=max(mx[in[sa[i]]],sa[i]);
  61. mn[in[sa[i]]]=min(mn[in[sa[i]]],sa[i]);
  62. mx[in[sa[i-]]]=max(mx[in[sa[i-]]],sa[i-]);
  63. mn[in[sa[i-]]]=min(mn[in[sa[i-]]],sa[i-]);
  64. int j;
  65. for (j=;j<k;j++)
  66. if (mx[j]-mn[j]<mid)break;
  67. if (j==k) return ;
  68. }
  69. }
  70. return ;
  71. }
  72. int main()
  73. {
  74. int cnt=,t;
  75. scanf("%d",&t);
  76. while (t--)
  77. {
  78. scanf("%d",&k);
  79. int n=;
  80. for (int i=;i<k;i++)
  81. {
  82. scanf("%s",ch);
  83. l[i]=strlen(ch);
  84. for (int j=n;j<n+l[i];j++)
  85. {
  86. str[j]=ch[j-n]-'a'+;
  87. in[j]=i;
  88. }
  89. n+=l[i]+;
  90. str[n-]=+i;
  91. }
  92. n--;
  93. str[n]=;
  94. da(str,sa,n+,+k+);
  95. calheight(str,sa,n);
  96. int l=,r=;
  97. while (l<r)
  98. {
  99. int mid=(l+r+)/;
  100. if (pd(mid,n))l=mid;
  101. else r=mid-;
  102. }
  103. printf("%d\n",l);
  104. }
  105. return ;
  106. }

spoj220的更多相关文章

  1. 【SPOJ220】Relevant Phrases of Annihilation(后缀数组,二分)

    题意: n<=10,len<=1e4 思路: #include<cstdio> #include<cstring> #include<string> # ...

  2. SPOJ220 Relevant Phrases of Annihilation(后缀数组)

    引用罗穗骞论文中的话: 先将n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组.然后二分答案,再将后缀分组.判断的时候,要看是否有一组后缀在每个原来的字符串中至少出现两次,并 ...

  3. SPOJ220 Relevant Phrases of Annihilation

    http://www.spoj.com/problems/PHRASES/ 题意:给n个串,求n个串里面都有2个不重叠的最长的字串长度. 思路:二分答案,然后就可以嘿嘿嘿 PS:辣鸡题目毁我青春,一开 ...

  4. 2018.11.30 spoj220 Relevant Phrases of Annihilation(后缀数组+二分答案)

    传送门 代码: 先用特殊字符把所有字符串连接在一起. 然后二分答案将sasasa数组分组. 讨论是否存在一个组满足组内对于每一个字符串都存在两段不相交字串满足条件. #include<bits/ ...

  5. 【SPOJ220】Relevant Phrases of Annihilation (SA)

    成功完成3连T!   嗯没错,三道TLE简直爽到不行,于是滚去看是不是模版出问题了..拿了3份其他P党的模版扔上去,嗯继续TLE...蒟蒻表示无能为力了... 思路像论文里面说的,依旧二分长度然后分组 ...

  6. 【距离GDOI:131天】 后缀数组完毕

    用了近两周的时间,终于把罗神那篇后缀数组应用看完了,题目也写了一遍,T了无数次...详见前几篇博文... 后缀数组很重要的是那个height数组,可以用来做各种奇奇怪怪的东西...常用方法去是去二分, ...

  7. String Algorithm Summary - 1

    目录 Suffix Array Summay 单个字符串问题 两个字符串问题 多个字符串问题 AC-Automaton Summary 求长度为n(2e9)不包含给定字符串的合法串个数 包含至少一个词 ...

随机推荐

  1. sublime编辑器

    1.完全卸载sublime的方法. 打开preferences->browse packages 这个包,打开的那个目录,然后删除完整的sublime Text3目录就行. 2.sublime的 ...

  2. Ubuntu 16.04下docker ce的安装(待完善)

    参见:https://www.cnblogs.com/senlinyang/p/8203191.html https://blog.csdn.net/qq_34906391/article/detai ...

  3. Lombok插件

    Lombok简介 Lombok是一款好用顺手的工具,就像Google Guava一样,在此予以强烈推荐,每一个Java工程师都应该使用它.Lombok是一种Java™实用工具,可用来帮助开发人员消除J ...

  4. Linux下安装 jdk

    转自 http://www.cnblogs.com/shihaiming/p/5809553.html 0.下载jdk8 登录网址:http://www.oracle.com/technetwork/ ...

  5. laravel安装Excel安装不上

    1.生明版本号 composer require maatwebsite/excel 2.1我的PHP是7.0安装Excel得2.1 2.在composer.json中加入 "maatweb ...

  6. python记录day_20 多继承

    多继承 继承: x是一种y的时候.可以使用继承关系.是"is a"的关系 在python中,支持多继承,一个类可以拥有多个父类.但是多继承中, 存在着这样一个问题,当两个父类中出现 ...

  7. 【转】XP系统远程桌面连接2012R2提示:远程计算机需要网络级别身份验证,而您的计算机不支持该验证

    一.背景 因对方客户的服务器是内网的,需要操作更新服务器的数据库表信息,因此远程对方客户办公司的电脑远程服务器:但是在远程桌面连接出现问题. 二.错误问题 错误问题:“远程计算机需要网络级别身份验证, ...

  8. Matlab-5:牛顿迭代法工具箱

    function [f,L]=Newton(f,a) %this is newton teration whic is used for solving implicit One-dimensiona ...

  9. hdu-6437-最大费用流

    Problem L.Videos Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  10. Logstash 基础入门

    原文地址:Logstash 基础入门博客地址:http://www.extlight.com 一.前言 Logstash 是一个开源的数据收集引擎,它具有备实时数据传输能力.它可以统一过滤来自不同源的 ...