POJ 2774 Long Lon…
来源:互联网 发布:淘宝水印logo设计 编辑:程序博客网 时间:2024/06/06 03:58
题目链接:http://poj.org/problem?id=2774 int i,h,p;//用计数排序求出长度为1的suff值
int *x=wa,*t,*y=wb;
for(i=0;i<m;i++)
cnt[i]=0;
for(i=0;i<n;i++)
cnt[x[i]=r[i]]++;
for(i=1;i<m;i++)
cnt[i]+=cnt[i-1];
for(i=n-1;i>=0;i--)
suff[--cnt[x[i]]]=i; //其中x存放rank的值,以上是计数排序模块
//根据suff求出rank,再利用长度为h的rank为关键字,基数排序,求出长度为2*h的suff.
for(h=1,p=0;p<n;h<<=1,m=p)
{
for(p=0,i=n-h;i<n;i++)
y[p++]=i;
//y存放第二关键字排序的结果,这里有点技巧,你用上次的suff对第二关键子排序
for(i=0;i<n;i++)
if(suff[i]>=h)
y[p++]=suff[i]-h;
for(i=0;i<n;i++) //对第一关键字进行计数排序
wv[i]=x[y[i]];
for(i=0;i<m;i++)
给出两个长度均不大于100000的字符串
求出这两个字符串的最长公共子串。
#include <iostream>
#include <cstdio>
#include <cstring>
const int N=100005*2;
int suff[N],r[N],Height[N],rank[N];
int wa[N],cnt[N],wb[N],wv[N];
int len1,len;
char str[N];
int cmp(int *v,int a,int b,int h)
{
return v[a]==v[b]&&v[a+h]==v[b+h] ;
//这里要满足从a和b开始长度为h的前缀相同以及从a+h和b+h开始长度为h的前缀相同,
//这样才能判定长度为2h的前缀相同
}
void CreatSuff(int n,int m)
{
#include <cstdio>
#include <cstring>
const int N=100005*2;
int suff[N],r[N],Height[N],rank[N];
int wa[N],cnt[N],wb[N],wv[N];
int len1,len;
char str[N];
int cmp(int *v,int a,int b,int h)
{
}
void CreatSuff(int n,int m)
{