考虑简化问题:计算一个字符串中至少出现两次的最长子串。答案一定会在sa中相邻两个后缀的lcp中。因为后缀的位置在sa中相距越远,其lcp的长度就越短,这是由于字典序的性质决定的。

于是,在s1和s2中间插入字符'\0',然后等价于寻找两个后缀的lcp的最大值,且这两个后缀分属s1、s2。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 20002
int n,tong[N],sa[N],t[N],t2[N];
char s[N];
bool cmp(int *y,int i,int k)
{return ((y[sa[i-1]]==y[sa[i]])&&((sa[i-1]+k>=n?-1:y[sa[i-1]+k])==(sa[i]+k>=n?-1:y[sa[i]+k])));
}
void build_sa(int range)
{int *x=t,*y=t2;memset(tong,0,sizeof(int)*range);for(int i=0;i<n;++i) tong[x[i]=s[i]]++;for(int i=1;i<range;++i) tong[i]+=tong[i-1];for(int i=n-1;i>=0;--i) sa[--tong[x[i]]]=i;for(int k=1;k<=n;k<<=1){int p=0;for(int i=n-k;i<n;++i) y[p++]=i;for(int i=0;i<n;++i) if(sa[i]>=k) y[p++]=sa[i]-k;memset(tong,0,sizeof(int)*range);for(int i=0;i<n;++i) tong[x[y[i]]]++;for(int i=1;i<range;++i) tong[i]+=tong[i-1];for(int i=n-1;i>=0;--i) sa[--tong[x[y[i]]]]=y[i];swap(x,y); p=1; x[sa[0]]=0;for(int i=1;i<n;++i) x[sa[i]]=cmp(y,i,k)?p-1:p++;if(p>=n) break;range=p;}
}
int lcp[N],rank[N];
void get_lcp()
{int k=0;for(int i=0;i<n;++i) rank[sa[i]]=i;for(int i=0;i<n;++i) if(rank[i]){if(k) --k;int j=sa[rank[i]-1];while(s[i+k]==s[j+k]) ++k;lcp[rank[i]]=k;}
}
int T;
char s2[N];
int main()
{scanf("%d\n",&T);for(;T;--T){int ans=0;gets(s);int l=strlen(s);gets(s2);int l2=strlen(s2);n=l+l2+1;memcpy(s+l+1,s2,sizeof(char)*l2);build_sa(128);get_lcp();for(int i=1;i<n;++i) if((sa[i-1]<l&&sa[i]>l)||(sa[i]<l&&sa[i-1]>l))ans=max(ans,lcp[i]);printf("Nejdelsi spolecny retezec ma delku %d.\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/4460225.html

【后缀数组】bzoj2217 Secretary相关推荐

  1. POJ 2217 Secretary (后缀数组)

    原题链接 Problem Description The basic condition of success of a political party, it is the good Electio ...

  2. POJ 2217 Secretary (后缀数组,挑战程序)

    题目意思: 给出两个字符串,要求两个字符串最长的公共子串(是子串不是子序列) 挑战程序设计竞赛, 383 页 本题要点: 1.高度数组,lcp[i] 表示后缀数组中,第i个字符串 S[sa[i] -] ...

  3. 寻找一个字符串的重复子串 后缀数组

    什么是后缀数组 令字符串 S=S[1]S[2]...S[n]S=S[1]S[2]...S[n]{\displaystyle S=S[1]S[2]...S[n]} , S[i,j]S[i,j]{\dis ...

  4. 【2012百度之星/资格赛】H:用户请求中的品牌 [后缀数组]

    时间限制: 1000ms 内存限制: 65536kB 描述 馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇.在比方说"johnsonj ...

  5. Boring counting HDU - 3518 (后缀数组)

    Boring counting \[ Time Limit: 1000 ms \quad Memory Limit: 32768 kB \] 题意 给出一个字符串,求出其中出现两次及以上的子串个数,要 ...

  6. HDU4080 Stammering Aliens(二分 + 后缀数组)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=4080 Description Dr. Ellie Arroway has establish ...

  7. 后缀数组 + Hash + 二分 or Hash + 二分 + 双指针 求 LCP ---- 2017icpc 青岛 J Suffix (假题!!)

    题目链接 题目大意: 就是给你n个串每个串取一个后缀,要求把串拼起来要求字典序最小!! sum_length_of_n≤5e5sum\_length\_of\_n\leq 5e5sum_length_ ...

  8. 后缀数组 ---- 2018~2019icpc焦作H题[后缀数组+st表+二分+单调栈]

    题目链接 题目大意: 给出nnn个数,定义f[l,r]f[l,r]f[l,r]表示 区间[l,r][l,r][l,r]的最大值,求所有 子区间的最大值的和,要求相同的子区间只能算一次 比如数列 5 6 ...

  9. [Ahoi2013]差异[后缀数组+单调栈]

    链接 解题思路:很明显前面∑1<=i<j<=nlen(Ti)+len(Tj)\sum_{1<=i<j<=n}len(T_i)+len(T_j)∑1<=i< ...

  10. poj2217详解 ( 后缀数组 + 高度数组 )

    题目大概意思就是 给两个字符串,求最长公共字符串子串长度 我们可以考虑用后缀数组和高度数组 一个字符串 中 最长的两个相同字符串长度, 不就是 后缀数组中相邻两个后缀的最长公共前缀, 不就是 高度数组 ...

最新文章

  1. 用于自动驾驶的实时车道线检测和智能告警
  2. 【筛素数】P1579 哥德巴赫猜想(升级版)
  3. 文本挖掘(part2)--分词
  4. 精选6种制作酷炫动图的方法,收藏!
  5. s4800扫描电镜的CSS3_日立S4800扫描电镜中文使用手册
  6. sql alwayson群集 registerallprovidersip改为0_前沿观察 | 分布式SQL性能对比
  7. linux重启mysql一直_linux正确重启MySQL的方法
  8. c#app.config配置文件使用
  9. c语言贪婪遗传算法算法背包问题,求高手帮我用C语言写一个运用贪心和遗传算法求解背包问题的程序。。。。谢谢!!!!!!十分紧急!!!...
  10. leetcode之幂集(C++)
  11. android屏幕共享及远程控制,android屏幕共享及远程控制原理
  12. 如何安装故障恢复控制台
  13. 初入Kaggle之数据集的使用及预测结果生成
  14. typora配置好smms后还是typora上传图片失败:image load failed。
  15. 计算机网络技术个人简历范文,计算机网络技术专业个人简历自我评价范文
  16. 提高转化率的 3 个客户引导最佳实践
  17. 读论文:Noise2Noise: Learning Image Restoration without Clean Data
  18. vue 多层子组件调用父组件的方法(传参方式bind方法 或 注入 provide() {}方法)
  19. 解决浏览器能上网而其他软件无法联网的问题
  20. SOCKS代理的工作原理

热门文章

  1. C语言 NUL、NULL及eof
  2. python--- 之The program 'python' can be found in the following packages: * python-minimal * python3
  3. 收集的图像处理网站http://blog.csdn.net/chief1985/article/details/1898358
  4. php7与mysql相关配置_PHP7连接mysql,文件配置问题
  5. 正弦函数_傅里叶为什么会想到把函数展开为正弦波
  6. python如何加密_Python如何玩转数据加密?
  7. 按钮 java_按钮大小(Java)
  8. delphi7 dbgrid缓存模式下怎么判断输入重复记录_互联网公司的架构设计要怎么落地?| 技术头条...
  9. android购物车栏,Android怎么实现二级列表购物车功能
  10. 二进制安装mysql集群_实战mysql集群搭建(一)--centos7下二进制安装mysql-5.6