题意:

n<=10,len<=100

思路:

只有一个字符串的时候特判一下

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<string>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<map>
  8. #include<set>
  9. #include<queue>
  10. #include<vector>
  11. using namespace std;
  12. typedef long long ll;
  13. typedef unsigned int uint;
  14. typedef unsigned long long ull;
  15. typedef pair<int,int> PII;
  16. typedef vector<int> VI;
  17. #define fi first
  18. #define se second
  19. #define MP make_pair
  20. #define N 210000
  21. #define MOD 1000000007
  22. #define eps 1e-8
  23. #define pi acos(-1)
  24. #define oo 1000000000
  25.  
  26. char ch[N];
  27.  
  28. int n,i,s[N],sa[N],wa[N],wb[N],wc[N],wd[N],height[N],rank[N],
  29. a[N],b[N],num[N],M;
  30.  
  31. int read()
  32. {
  33. int v=,f=;
  34. char c=getchar();
  35. while(c<||<c) {if(c=='-') f=-; c=getchar();}
  36. while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
  37. return v*f;
  38. }
  39.  
  40. bool cmp(int *r,int a,int b,int l)
  41. {
  42. return r[a]==r[b]&&r[a+l]==r[b+l];
  43. }
  44.  
  45. void getsa(int *r,int *sa,int n,int m)
  46. {
  47. int *x=wa,*y=wb,j,p;
  48. for(i=;i<n;i++) wc[x[i]=r[i]]++;
  49. for(i=;i<m;i++) wc[i]+=wc[i-];
  50. for(i=n-;i>=;i--) sa[--wc[x[i]]]=i;
  51. for(j=,p=;p<n;j*=,m=p)
  52. {
  53. p=;
  54. for(i=n-j;i<n;i++) y[p++]=i;
  55. for(i=;i<n;i++)
  56. if(sa[i]>=j) y[p++]=sa[i]-j;
  57. for(i=;i<n;i++) wd[i]=x[y[i]];
  58. for(i=;i<m;i++) wc[i]=;
  59. for(i=;i<n;i++) wc[wd[i]]++;
  60. for(i=;i<m;i++) wc[i]+=wc[i-];
  61. for(i=n-;i>=;i--) sa[--wc[wd[i]]]=y[i];
  62. swap(x,y);
  63. p=; x[sa[]]=;
  64. for(i=;i<n;i++) x[sa[i]]=cmp(y,sa[i-],sa[i],j)?p-:p++;
  65. }
  66. }
  67.  
  68. void getheight(int *r,int *sa,int n)
  69. {
  70. int i,j,k=;
  71. for(i=;i<=n;i++) rank[sa[i]]=i;
  72. for(i=;i<n;height[rank[i++]]=k)
  73. {
  74. if(k) k--;
  75. j=sa[rank[i]-];
  76. while(r[i+k]==r[j+k]) k++;
  77. }
  78. }
  79.  
  80. void init()
  81. {
  82. memset(s,,sizeof(s));
  83. memset(sa,,sizeof(sa));
  84. memset(wa,,sizeof(wa));
  85. memset(wb,,sizeof(wb));
  86. memset(wc,,sizeof(wc));
  87. memset(wd,,sizeof(wd));
  88. memset(height,,sizeof(height));
  89. memset(rank,,sizeof(rank));
  90. }
  91.  
  92. bool isok(int K)
  93. {
  94. int i=;
  95. while(i<n)
  96. {
  97. i++;
  98. if(height[i]>=K)
  99. {
  100. int st=i;
  101. while(i<=n&&height[i]>=K) i++;
  102. for(int j=;j<=M;j++) b[j]=;
  103. for(int j=max(,st-);j<=i-;j++)
  104. {
  105. int t=sa[j];
  106. b[num[t]]++;
  107. }
  108. int flag=;
  109. for(int j=;j<=M;j++)
  110. if(!b[j]){flag=; break;}
  111. if(flag) return ;
  112. }
  113. }
  114. return ;
  115. }
  116.  
  117. int main()
  118. {
  119. //freopen("poj1226.in","r",stdin);
  120. //freopen("poj1226.out","w",stdout);
  121. int cas;
  122. scanf("%d",&cas);
  123. while(cas--)
  124. {
  125. init();
  126. scanf("%d",&M);
  127. n=-;
  128. int p=;
  129. for(int i=;i<=M;i++)
  130. {
  131. scanf("%s",ch);
  132. int t=strlen(ch);
  133. if(M==) printf("%d\n",t);
  134. for(int j=;j<t;j++)
  135. {
  136. s[++n]=ch[j]+;
  137. num[n]=i;
  138. }
  139. s[++n]=p++;
  140. num[n]=;
  141. for(int j=t-;j>=;j--)
  142. {
  143. s[++n]=ch[j]+;
  144. num[n]=i;
  145. }
  146. s[++n]=p++;
  147. num[n]=;
  148. }
  149. if(M==) continue;
  150. //printf("1\n");
  151. getsa(s,sa,n+,);
  152. getheight(s,sa,n);
  153. //for(int i=2;i<=n;i++) printf("%d\n",height[i]);
  154. int L=;
  155. int R=;
  156. int last=;
  157. while(L<=R)
  158. {
  159. int mid=(L+R)>>;
  160. if(isok(mid)){last=mid; L=mid+;}
  161. else R=mid-;
  162. }
  163. printf("%d\n",last);
  164. memset(num,,sizeof(num));
  165. }
  166. return ;
  167. }

【POJ1226】Substrings(后缀数组,二分)的更多相关文章

  1. POJ1226 Substrings ——后缀数组 or 暴力+strstr()函数 最长公共子串

    题目链接:https://vjudge.net/problem/POJ-1226 Substrings Time Limit: 1000MS   Memory Limit: 10000K Total ...

  2. POJ1226:Substrings(后缀数组)

    Description You are given a number of case-sensitive strings of alphabetic characters, find the larg ...

  3. poj 3415 Common Substrings - 后缀数组 - 二分答案 - 单调栈

    题目传送门 传送点I 传送点II 题目大意 给定串$A, B$,求$A$和$B$长度大于等于$k$的公共子串的数量. 根据常用套路,用一个奇怪的字符把$A$,$B$连接起来,然后二分答案,然后按mid ...

  4. BZOJ 3230: 相似子串( RMQ + 后缀数组 + 二分 )

    二分查找求出k大串, 然后正反做后缀数组, RMQ求LCP, 时间复杂度O(NlogN+logN) -------------------------------------------------- ...

  5. BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案

    BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案 Description          给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l        读入单 ...

  6. 【bzoj4310】跳蚤 后缀数组+二分

    题目描述 很久很久以前,森林里住着一群跳蚤.一天,跳蚤国王得到了一个神秘的字符串,它想进行研究. 首先,他会把串分成不超过 k 个子串,然后对于每个子串 S,他会从S的所有子串中选择字典序最大的那一个 ...

  7. BZOJ 1717 [USACO06DEC] Milk Patterns (后缀数组+二分)

    题目大意:求可重叠的相同子串数量至少是K的子串最长长度 洛谷传送门 依然是后缀数组+二分,先用后缀数组处理出height 每次二分出一个长度x,然后去验证,在排序的后缀串集合里,有没有连续数量多于K个 ...

  8. POJ 1743 [USACO5.1] Musical Theme (后缀数组+二分)

    洛谷P2743传送门 题目大意:给你一个序列,求其中最长的一对相似等长子串 一对合法的相似子串被定义为: 1.任意一个子串长度都大于等于5 2.不能有重叠部分 3.其中一个子串可以在全部+/-某个值后 ...

  9. Poj 1743 Musical Theme(后缀数组+二分答案)

    Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 28435 Accepted: 9604 Descri ...

  10. Poj 3261 Milk Patterns(后缀数组+二分答案)

    Milk Patterns Case Time Limit: 2000MS Description Farmer John has noticed that the quality of milk g ...

随机推荐

  1. k8s framework

    reference 1. k8s master framework master master 是k8s cluster运行着daemon服务:kube-apiserver, kube-schedul ...

  2. 洛谷 P1514 引水入城

    这次不说闲话了,直接怼题 这道题用bfs其实并不难想,但比较困难的是怎么解决满足要求时输出蓄水厂的数量.其实就像其他题解说的那样,我们可以用bfs将它转化成一个区间覆盖问题,然后再进行贪心. 首先枚举 ...

  3. AOP日志组件 多次获取post参数

    AOP日志组件 多次获取post参数 需求:新增接口日志组件.通过拦截器对接口URL进行拦截处理,然后将接口post请求的参数与结果,写入日志表. 问题:POST方法的参数是存储在request.ge ...

  4. 【求助】NdisSend,自定义数据包发送失败?

    做ndis hook的时候,自定义了一个数据包,包结构应该没有问题,填充NDIS_PACKET结构是这样的,先初始化:        NdisAllocatePacketPool(&nStat ...

  5. vim的卸载以及环境的配置小记

    一.背景 由于之前配置错误,导致我的YouCompleteMe这个插件不能用了,一直提示: ERROR:Required vim compiled with +python. YouCompleteM ...

  6. 四:SQL语句介绍

    前言:介绍SQL语句及其大致的分类 一:SQL语句介绍(Structured SQL Lanage) 结构化的查询语言 是一种特殊的编程语言 是一种数据库查询和程序设计语言 用于存取数据及查询.更新和 ...

  7. java获取本地计算机MAC地址

    java获取本地计算机MAC地址代码如下: public class SocketMac { //将读取的计算机MAC地址字节转化为字符串 public static String transByte ...

  8. Ubuntu中安装配置 JDK与apache

    一,前期准备: 1.下载apach网址:https://tomcat.apache.org/download-90.cgi 3.下载:jdk网址:http://www.oracle.com/techn ...

  9. shell 中exec、source以及bash的区别

    在bash shell中,source.exec以及sh都可以用来执行shell script,但是它们的差别在哪里呢? sh:父进程会fork一个子进程,shell script在子进程中执行 so ...

  10. Linux下配置MySQL主从复制

    一.环境准备 本次准备两台Linux主机,操作系统都为CentOS6.8, 都安装了相同版本的MySQL.(MySQL5.7). 主从服务器的防火墙都开启了3306端口. 相关信息如下: [主服务器] ...