poj2217 后缀数组
来源:互联网 发布:电视直播点播软件 编辑:程序博客网 时间:2024/06/02 08:48
2Tady nejsou zadni mimozemstani.Lide tady take nejsou.Ja do lesa nepojedu.V sobotu pojedeme na vylet.
Nejdelsi spolecny retezec ma delku 7.Nejdelsi spolecny retezec ma delku 5.
题意:给你两个串,求最大公共子串的长度
思路:将两个串连在一起,用分隔符分割一下,然后求sa数组和height数组,height数组的最大值即为所求
ac代码:
#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>#define maxn 200005using namespace std;char str[maxn];int sa[maxn],t1[maxn],t2[maxn],c[maxn],n;void suffix(int m){ int *x=t1,*y=t2; for(int i=0;i<m;i++)c[i]=0; for(int i=0;i<n;i++)c[x[i]=str[i]]++; for(int i=1;i<m;i++)c[i]+=c[i-1]; for(int i=n-1;i>=0;i--)sa[--c[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; for(int i=0;i<m;i++)c[i]=0; for(int i=0;i<n;i++)c[x[y[i]]]++; for(int i=0;i<m;i++)c[i]+=c[i-1]; for(int i=n-1;i>=0;i--)sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1;x[sa[0]]=0; for(int i=1;i<n;i++) x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; if(p>=n)break; m=p; }}int rank[maxn],height[maxn];void getheight(){ int k=0; for(int i=0;i<n;i++)rank[sa[i]]=i; for(int i=0;i<n;i++) { if(k)k--; if(!rank[i])continue; int j=sa[rank[i]-1]; while(str[i+k]==str[j+k])k++; height[rank[i]]=k; }}char tmp[11111];int main(){ int T; scanf("%d",&T); getchar(); while(T--) { gets(tmp); int len=strlen(tmp); int top=0; for(int i=0;i<=len;i++) str[top++]=tmp[i]; gets(tmp); int cnt=0; while(tmp[cnt]!='\0')str[top++]=tmp[cnt++]; n=top; suffix(256); getheight(); int ans=0; for(int i=1;i<n;i++) { if((sa[i-1]<len)!=(sa[i]<len)) ans=max(ans,height[i]); } printf("Nejdelsi spolecny retezec ma delku %d.\n",ans); } return 0;}
- poj2217 后缀数组
- POJ2217——Secretary(后缀数组应用)
- EOJ1805 POJ2217 最长公共子串(后缀数组+高度数组)
- POJ2217
- 后缀树/后缀数组
- 后缀树 后缀数组
- 【后缀数组】后缀排序
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- 后缀数组
- for 续4
- C语言逗号运算符和逗号表达式
- Ajax请求Json遇到的问题总结
- 模块继续
- Ubuntu mysql 安装
- poj2217 后缀数组
- 为什么你要写博客?(见过最赞的回答)
- ContentProvider(增删改)
- java多线程问题
- POJ1861-Network(Kruskal)
- LeetCode 50. Pow(x, n)
- 最长公共子序列和最长公共子串的区别
- Lottie for Android
- (转载)使用IntelliJ IDEA开发SpringMVC网站——开发环境