http://poj.org/problem?id=1226

题意:给定n个串。求一个最长的串,使得这个串或者其反串在每个串中都出现过?

思路:先在大串里面加入正反串,然后二分,判定即可。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<algorithm>
  6. int num[],ws[],wv[],wb[],wa[];
  7. int n,m,rank[],sa[],h[],b[];
  8. int read(){
  9. int t=,f=;char ch=getchar();
  10. while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
  11. while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
  12. return t*f;
  13. }
  14. bool cmp(int *r,int a,int b,int l){
  15. return r[a]==r[b]&&r[a+l]==r[b+l];
  16. }
  17. void da(int *r,int *sa,int n,int m){
  18. int *y=wb,*x=wa,*t,i,j,p;
  19. for (i=;i<m;i++) ws[i]=;
  20. for (i=;i<n;i++) x[i]=r[i];
  21. for (i=;i<n;i++) ws[x[i]]++;
  22. for (i=;i<m;i++) ws[i]+=ws[i-];
  23. for (i=n-;i>=;i--) sa[--ws[x[i]]]=i;
  24. for (p=,j=;p<n;m=p,j*=){
  25. for (p=,i=n-j;i<n;i++) y[p++]=i;
  26. for (i=;i<n;i++) if (sa[i]>=j) y[p++]=sa[i]-j;
  27. for (i=;i<m;i++) ws[i]=;
  28. for (i=;i<n;i++) wv[i]=x[y[i]];
  29. for (i=;i<n;i++) ws[wv[i]]++;
  30. for (i=;i<m;i++) ws[i]+=ws[i-];
  31. for (i=n-;i>=;i--) sa[--ws[wv[i]]]=y[i];
  32. for (t=x,x=y,y=t,i=,p=,x[sa[]]=;i<n;i++)
  33. x[sa[i]]=cmp(y,sa[i],sa[i-],j)?p-:p++;
  34. }
  35. }
  36. void cal(int *r,int n){
  37. int i,j,k=;
  38. for (i=;i<=n;i++) rank[sa[i]]=i;
  39. for (i=;i<n;h[rank[i++]]=k)
  40. for (k?k--:,j=sa[rank[i]-];r[i+k]==r[j+k];k++);
  41. }
  42. bool check(int x){
  43. int L,R;
  44. int hash[];
  45. for (int i=;i<=n;i++){
  46. L=i;
  47. while (L<=n&&h[L]<x) L++;
  48. if (L>n) break;
  49. R=L;
  50. while (R<=n&&h[R]>=x) R++;
  51. memset(hash,,sizeof hash);
  52. for (int j=L-;j<=R-;j++)
  53. if (b[sa[j]]<=m)
  54. hash[b[sa[j]]]=;
  55. int j=;
  56. for (j=;j<=m;j++)
  57. if (!hash[j]) break;
  58. if (j>m) return ;
  59. i=R;
  60. }
  61. return ;
  62. }
  63. void solve(){
  64. int l=,r=,ans;
  65. while (l<=r){
  66. int mid=(l+r)>>;
  67. if (check(mid)) ans=mid,l=mid+;
  68. else r=mid-;
  69. }
  70. printf("%d\n",ans);
  71. }
  72. int main(){
  73. int T=read();
  74. char s[];
  75. while (T--){
  76. m=read();n=;int sx=;
  77. for (int i=;i<=m;i++){
  78. scanf("%s",s);
  79. int len=strlen(s);
  80. for (int j=;j<len;j++)
  81. num[n]=s[j],b[n++]=i;
  82. num[n]=sx++;b[n++]=n+;
  83. for (int j=len-;j>=;j--)
  84. num[n]=s[j],b[n++]=i;
  85. num[n]=sx++;b[n++]=n+;
  86. }
  87. num[n]=;b[n]=n+;
  88. da(num,sa,n+,sx+);
  89. cal(num,n);
  90. solve();
  91. }
  92. }

POJ 1225 Substrings的更多相关文章

  1. OpenJudge/Poj 1226 Substrings

    1.链接地址: http://bailian.openjudge.cn/practice/1226/ http://poj.org/problem?id=1226 2.题目: 总时间限制: 1000m ...

  2. POJ 1226 Substrings(后缀数组+二分答案)

    [题目链接] http://poj.org/problem?id=1226 [题目大意] 求在每个给出字符串中出现的最长子串的长度,字符串在出现的时候可以是倒置的. [题解] 我们将每个字符串倒置,用 ...

  3. POJ 1226 Substrings

    Substrings Time Limit: 1000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ID: ...

  4. POJ - 1226 Substrings (后缀数组)

    传送门:POJ - 1226 这个题跟POJ - 3294  和POJ - 3450 都是一样的思路,一种题型. POJ - 3294的题解可以见:https://www.cnblogs.com/li ...

  5. 后缀自动机(SAM)

    *在学习后缀自动机之前需要熟练掌握WA自动机.RE自动机与TLE自动机* 什么是后缀自动机 后缀自动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂度构造,能够接受一个字符 ...

  6. KUANGBIN带你飞

    KUANGBIN带你飞 全专题整理 https://www.cnblogs.com/slzk/articles/7402292.html 专题一 简单搜索 POJ 1321 棋盘问题    //201 ...

  7. kuangbin带你飞 后缀数组 题解

    2份模板 DC3 . 空间复杂度O3N 时间复杂度On #define F(x) ((x) / 3 + ((x) % 3 == 1 ? 0 : tb)) #define G(x) ((x) < ...

  8. [kuangbin带你飞]专题1-23题目清单总结

    [kuangbin带你飞]专题1-23 专题一 简单搜索 POJ 1321 棋盘问题POJ 2251 Dungeon MasterPOJ 3278 Catch That CowPOJ 3279 Fli ...

  9. 后缀自己主动机(SAM)学习指南

    *在学习后缀自己主动机之前须要熟练掌握WA自己主动机.RE自己主动机与TLE自己主动机* 什么是后缀自己主动机 后缀自己主动机 Suffix Automaton (SAM) 是一个用 O(n) 的复杂 ...

随机推荐

  1. css属性之!important

    提升指定样式规则的应用优先权. IE6及以下浏览器有个比较显式的支持问题存在,!important在同一条规则集里不生效.请看下述代码: div { color: #f00 !important; c ...

  2. HDU_2015——偶数求和

    Problem Description 有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值 ...

  3. 高德JAVA笔试题

    1.常用的RuntimeException. 2.叙述RuntimeException和一般异常的异同. 3.叙述ArrayList.Vector和LinkedList各自的特点和特性. 4.什么是反 ...

  4. B - Network - uva 315(求割点)

    题意:给一个无向连通图,求出割点的数量. 首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束(很蛋疼的输入方式). 分析:割点的模板题 ...

  5. 取得select框的text

    function selectInput(choose) {     alert(choose.options[choose.selectedIndex].text);  }

  6. 关闭myeclipse中jsp的校验功能

    window--->preference--->Myeclipse--->Validation,取消下图红框中的选中状态.

  7. SAN和NAS的区别

    SAN : STORAGE AREA NETWORK   存储区域网络 NAS : NETWORK ATTACHED STORAGE 网络附加存储 NAS不一定是盘阵,一台普通的主机就可以做出NAS, ...

  8. source insight3.5中文乱码解决方案

    source insight3.5中文乱码,网上看别人说改变宽字体.宋体等方法都不起效.根本原因是,source insight 3.5 不支持Unicode编码,所以导致中文的乱码,将文件转为gb2 ...

  9. C#和.NET Framework

    .NET Framework概述 .NET Framework是由微软开发,一个致力于敏捷软件开发.快速应用开发.平台无关性和网络透明化的软件开发平台. .NET Framework组成 .NET F ...

  10. 【socket.io研究】0.前提准备

    WebSocket出现之前,web实时推送,一般采用轮询和Comet技术(可细分为长轮询机制和流技术两种),需要大量http请求,服务器受不了.HTML5定义了WebSocket协议,基于TCP协议, ...