k_over 重叠字符串
来源:互联网 发布:手机超星怎么看网络课 编辑:程序博客网 时间:2024/06/05 09:05
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define maxn 1024
#define maxm 1024
int bufa[maxn],bufb[maxn],bufs[maxm],bufv[maxn];
int sa[maxn],height[maxn],rank[maxn];
int cmp(int *src,int a,int b,int l){
return src[a]==src[b]&&src[a+l]==src[b+l];
}
void da(int *src,int n,int m)
{
int i,*x=bufa,*y=bufb,*t;
for(i=0;i<m;i++) bufs[i]=0;
for(i=0;i<n;i++) bufs[x[i]=src[i]]++;
for(i=1;i<m;i++) bufs[i]+=bufs[i-1];
for(i=n-1;i>=0;i--)sa[--bufs[x[i]]]=i;
int p=0,j;
for(j=1,p=1;p<n;j*=2,m=p)
{
for(p=0,i=n-j;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<n;i++) bufv[i]=x[y[i]];
for(i=0;i<m;i++) bufs[i]=0;
for(i=0;i<n;i++) bufs[bufv[i]]++;
for(i=1;i<m;i++) bufs[i]+=bufs[i-1];
for(i=n-1;i>=0;i--) sa[--bufs[bufv[i]]]=y[i];
for(t=x,x=y,y=t,i=1,p=1,x[sa[0]]=0;i<n;i++)
x[sa[i]]=cmp(y,sa[i],sa[i-1],j)? p-1:p++;
}
}
void cal_height(int *src,int n)
{
int i,k,j;
for(i=1;i<n;++i) rank[sa[i]]=i;
for(i=0,k=0;i<n;height[rank[i++]]=k)
for(k? k--:0,j=sa[rank[i]-1];src[i+k]==src[j+k];k++)
;
}
int RMQ[maxn],mm[maxn];
int best[20][maxn];
void initRMQ(int n)
{
int i,j,a,b;
for(mm[0]=-1,i=1;i<n;i++)
mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
for(i=1;i<n;i++) best[0][i]=i;
for(i=1;i<=mm[n-1];i++)
for(j=1;j<n-(1<<i)+1;j++){
a=best[i-1][j];
b=best[i-1][j+(1<<(i-1))];
best[i][j]=RMQ[a]>RMQ[b]? a:b;
}
}
int askRMQ(int a,int b)
{
int t;
t=mm[b-a+1]; b-=((1<<t)-1);
a=best[t][a];
b=best[t][b];
return RMQ[a]>RMQ[b] ? sa[a-1]:sa[b-1];
}
int abs(int n) { return n<0? -n:n;}
int check(int n)
{
int test=(n-1)/2,i;
int max=0,min=0x7fffffff;
for(;test>0;test--){
printf("test=%d\n", test);
for(i=1;i<n;i++)
if(height[i]>=test){
if(sa[i-1]>max) max=sa[i-1];
if(sa[i]>max) max=sa[i];
if(sa[i-1]<min) min=sa[i-1];
if(sa[i]<min) min=sa[i];
if(max-min>=test)
return test;
}
else
max=0;
}
return test;
}
int main()
{
char src[maxn],c;
int nsrc[maxn];
int i=0,n;
bzero(src,sizeof(src));
while((c=getchar())!='\n') src[i++]=c;
n=strlen(src);
for(i=0;i<n;i++) nsrc[i]=src[i];
nsrc[n++]=0;
da(nsrc,n,1024);
cal_height(nsrc,n);
for(i=1;i<n;i++) RMQ[i]=height[i];
initRMQ(n);
for(i=1;i<n;i++) printf("%d--> %d\n",i,height[i]);puts("");
for(i=1;i<n;i++) printf("%d\n", sa[i]-sa[i-1]);
for(i=0;i<n;i++) printf("%s\n",src+sa[i]);
printf("%d\n",check(n));
// printf("max len lapped substr:\n");
// int pos=askRMQ(1,n-1);
// int slen=RMQ[rank[pos]+1];
// printf("slen=%d\n",slen);
// printf("pos=%d\n",pos);
// *(src+pos+slen)=0;
// printf("%s\n",src+pos);
}
#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;
#define maxn 1024
#define maxm 1024
int bufa[maxn],bufb[maxn],bufs[maxm],bufv[maxn];
int sa[maxn],height[maxn],rank[maxn];
int cmp(int *src,int a,int b,int l){
return src[a]==src[b]&&src[a+l]==src[b+l];
}
void da(int *src,int n,int m)
{
int i,*x=bufa,*y=bufb,*t;
for(i=0;i<m;i++) bufs[i]=0;
for(i=0;i<n;i++) bufs[x[i]=src[i]]++;
for(i=1;i<m;i++) bufs[i]+=bufs[i-1];
for(i=n-1;i>=0;i--)sa[--bufs[x[i]]]=i;
int p=0,j;
for(j=1,p=1;p<n;j*=2,m=p)
{
for(p=0,i=n-j;i<n;i++) y[p++]=i;
for(i=0;i<n;i++) if(sa[i]>=j) y[p++]=sa[i]-j;
for(i=0;i<n;i++) bufv[i]=x[y[i]];
for(i=0;i<m;i++) bufs[i]=0;
for(i=0;i<n;i++) bufs[bufv[i]]++;
for(i=1;i<m;i++) bufs[i]+=bufs[i-1];
for(i=n-1;i>=0;i--) sa[--bufs[bufv[i]]]=y[i];
for(t=x,x=y,y=t,i=1,p=1,x[sa[0]]=0;i<n;i++)
x[sa[i]]=cmp(y,sa[i],sa[i-1],j)? p-1:p++;
}
}
void cal_height(int *src,int n)
{
int i,k,j;
for(i=1;i<n;++i) rank[sa[i]]=i;
for(i=0,k=0;i<n;height[rank[i++]]=k)
for(k? k--:0,j=sa[rank[i]-1];src[i+k]==src[j+k];k++)
;
}
int RMQ[maxn],mm[maxn];
int best[20][maxn];
void initRMQ(int n)
{
int i,j,a,b;
for(mm[0]=-1,i=1;i<n;i++)
mm[i]=((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
for(i=1;i<n;i++) best[0][i]=i;
for(i=1;i<=mm[n-1];i++)
for(j=1;j<n-(1<<i)+1;j++){
a=best[i-1][j];
b=best[i-1][j+(1<<(i-1))];
best[i][j]=RMQ[a]>RMQ[b]? a:b;
}
}
int askRMQ(int a,int b)
{
int t;
t=mm[b-a+1]; b-=((1<<t)-1);
a=best[t][a];
b=best[t][b];
return RMQ[a]>RMQ[b] ? sa[a-1]:sa[b-1];
}
int abs(int n) { return n<0? -n:n;}
int check(int n)
{
int test=(n-1)/2,i;
int max=0,min=0x7fffffff;
for(;test>0;test--){
printf("test=%d\n", test);
for(i=1;i<n;i++)
if(height[i]>=test){
if(sa[i-1]>max) max=sa[i-1];
if(sa[i]>max) max=sa[i];
if(sa[i-1]<min) min=sa[i-1];
if(sa[i]<min) min=sa[i];
if(max-min>=test)
return test;
}
else
max=0;
}
return test;
}
int main()
{
char src[maxn],c;
int nsrc[maxn];
int i=0,n;
bzero(src,sizeof(src));
while((c=getchar())!='\n') src[i++]=c;
n=strlen(src);
for(i=0;i<n;i++) nsrc[i]=src[i];
nsrc[n++]=0;
da(nsrc,n,1024);
cal_height(nsrc,n);
for(i=1;i<n;i++) RMQ[i]=height[i];
initRMQ(n);
for(i=1;i<n;i++) printf("%d--> %d\n",i,height[i]);puts("");
for(i=1;i<n;i++) printf("%d\n", sa[i]-sa[i-1]);
for(i=0;i<n;i++) printf("%s\n",src+sa[i]);
printf("%d\n",check(n));
// printf("max len lapped substr:\n");
// int pos=askRMQ(1,n-1);
// int slen=RMQ[rank[pos]+1];
// printf("slen=%d\n",slen);
// printf("pos=%d\n",pos);
// *(src+pos+slen)=0;
// printf("%s\n",src+pos);
}
- k_over 重叠字符串
- 重叠字符串
- kali终端字符串重叠
- poj 1743 求不可重叠最长字符串
- 合并两个字符串的重叠部分
- Kali2016终端字符串重叠解问题解决
- 如何解决字符串内存重叠的拷贝
- 经典问题:字符串可分割成多少个相同重叠/不重叠子串(2087)
- 考虑了内存重叠的字符串拷贝函数strcpy
- 九度1535 重叠的最长字串 字符串哈希
- java面试题--获取重叠字符串的个数组成一个新字符串
- poj 1743 字符串 后缀数组 不可重叠最长重复子串
- 求两个字符串的前后重叠的最长子串的长度
- spoj220 每个字符串至少出现两次且不重叠的最长子串(后缀数组)
- 【编程珠玑】第十五章--字符串:用后缀数组查找最长不重叠的重复子串
- 后缀数组(每个字符串至少出现两次且不重叠的最长子串)spoj220
- 【后缀数组】 POJ 3882 Stammering Aliens 可重叠出现k次字符串
- SPOJ PHRASES 每个字符串至少出现两次且不重叠的最长子串
- samba的配置文件, 共享opt和home目录
- kmp 练习下
- 打印前N个素数
- gcc 编译选项
- aba 回文练习 -- 参考罗大神的
- k_over 重叠字符串
- m_sort 归并排序(迭代)
- insert /*+append*/ into (直接插入)logging失效
- Java算法(链表操作实例)
- 设计响应式导航菜单的五大法则
- How to Connect to Oracle via JDBC
- Android ApiDemos示例解析(192):Views->Spinner
- Java Web应用程序开发
- 最近的软考