思路:

论文题

后缀数组&RMQ

有一些题解写得很繁

//By SiriusRen
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100050
int n,cases,cntA[N],cntB[N],A[N],B[N],rk[N],sa[N],tsa[N],ht[N],f[N][18],Log[N],stk[N],top,maxx;
char s[N];
void SA(){
memset(cntA,0,sizeof(cntA));
for(int i=1;i<=n;i++)cntA[s[i]]++;
for(int i=1;i<=256;i++)cntA[i]+=cntA[i-1];
for(int i=1;i<=n;i++)sa[cntA[s[i]]--]=i;
rk[sa[1]]=1;
for(int i=2;i<=n;i++)rk[sa[i]]=rk[sa[i-1]]+(s[sa[i]]!=s[sa[i-1]]);
for(int l=1;rk[sa[n]]<n;l<<=1){
memset(cntA,0,sizeof(cntA));
memset(cntB,0,sizeof(cntB));
for(int i=1;i<=n;i++)
cntA[A[i]=rk[i]]++,
cntB[B[i]=i+l<=n?rk[i+l]:0]++;
for(int i=1;i<=n;i++)cntA[i]+=cntA[i-1],cntB[i]+=cntB[i-1];
for(int i=n;i;i--)tsa[cntB[B[i]]--]=i;
for(int i=n;i;i--)sa[cntA[A[tsa[i]]]--]=tsa[i];
rk[sa[1]]=1;
for(int i=2;i<=n;i++)rk[sa[i]]=rk[sa[i-1]]+(A[sa[i]]!=A[sa[i-1]]||B[sa[i]]!=B[sa[i-1]]);
}
for(int i=1,j=0;i<=n;i++){
j=j?j-1:0;
while(s[i+j]==s[sa[rk[i]-1]+j])j++;
ht[rk[i]]=j;
}
}
void RMQ(){
for(int i=1;i<=n;i++)f[i][0]=ht[i];
for(int i=1;i<=16;i++)
for(int j=1;j<=n;j++)if(j+(1<<i)-1<=n)
f[j][i]=min(f[j][i-1],f[j+(1<<(i-1))][i-1]);
}
int LCP(int x,int y){
int tempx=rk[x],tempy=rk[y];
if(tempx>tempy)swap(tempx,tempy);
tempx++;int t=Log[tempy-tempx+1];
return min(f[tempx][t],f[tempy-(1<<t)+1][t]);
}
int main(){
Log[0]=-1;
for(int i=1;i<N;i++)Log[i]=i&(i-1)?Log[i-1]:Log[i-1]+1;
while(scanf("%s",s+1)&&s[1]!='#'){
maxx=0,n=strlen(s+1),SA(),RMQ();
for(int i=1;i<=n/2;i++){
for(int j=1;i+j<=n;j+=i){
int r=LCP(j,j+i),tot=r/i+1,st=j-(i-r%i);
if(st>0&&r%i&&LCP(st,st+i)>=r)tot++;
if(tot>maxx)maxx=tot,stk[top=1]=i;
else if(tot==maxx)stk[++top]=i;
}
}
int len=-1,st;
for(int i=1;i<=n&&len==-1;i++)
for(int j=1;j<=top;j++)
if(LCP(sa[i],sa[i]+stk[j])>=(maxx-1)*stk[j])
{len=stk[j],st=sa[i];break;}
printf("Case %d: ",++cases);
for(int i=0;i<len*maxx;i++)printf("%c",s[i+st]);puts("");
}
}

最新文章

  1. 华硕Z97-A主板声卡设置
  2. NHibernate系列文章二十八:NHibernate Mapping之Auto Mapping(附程序下载)
  3. ssh批量互信脚本
  4. 表单提交中get和post方式的区别
  5. Android 学习笔记之Volley开源框架解析(四)
  6. POJ 3468 区间更新,区间求和(经典)
  7. 《Code Complete》ch.15 使用条件语句
  8. ActionResult 返回类型
  9. WIN8重见开始菜单
  10. 将页面中指定表格的数据导入到Excel中
  11. android 监听app进入后台以及从后台进入前台
  12. ubuntu 系统设置bugzilla制
  13. JDBC调用存储过程
  14. groovy install,gvm,groovysh简述(转)
  15. FPGA 设计怎样进行面积优化(逻辑资源占用量优化)
  16. 用maven搭建java ee项目
  17. 学习笔记-使用cmd命令行创建nodejs项目
  18. Java EE 之 过滤器入门学习与总结(1)
  19. JDBC的使用-----Statement
  20. python中矩阵的用法

热门文章

  1. python 从bulkblacklist信誉查询网站提交查询
  2. 19. Remove Nth Node From End of List[M]删除链表的倒数第N个节点
  3. maven、spring jdbc与mysql、mybatis
  4. BZOJ 4710 容斥原理+dp
  5. Asp.Net Core部署到Linux服务器
  6. SSH三个主流框架环境的搭建
  7. Oracle自制事务
  8. php语法学习:轻松看懂PHP语言
  9. CorelDRAW结合Photoshop绘制女性服装效果图
  10. dp入门(先摆在这里,之后细细读)