The repetition number of a string is defined as the maximum number R such that the string can be partitioned into R same consecutive substrings. For example, the repetition number of "ababab" is 3 and "ababa" is 1.

Given a string containing lowercase letters, you are to find a substring of it with maximum repetition number.

Input

The input consists of multiple test cases. Each test case contains exactly one line, which
gives a non-empty string consisting of lowercase letters. The length of the string will not be greater than 100,000.

The last test case is followed by a line containing a '#'.

Output

For each test case, print a line containing the test case number( beginning with 1) followed by the substring of maximum repetition number. If there are multiple substrings of maximum repetition number, print the lexicographically smallest one.

Sample Input

ccabababc
daabbccaa
#

Sample Output

Case 1: ababab
Case 2: aa

题意:

求里面一段字符串,它的循环次数最多,如果有多个,输出最小字典序的一个。

思路就不说了,老题,可以去看论文。但是至少需要知道循环节的性质(具体的去KMP那里去看),大概是这样:

s1=x y z

s2=   x y z。如果,s1=s2,且下面的x对应上面的y,下面的y对应上面的z,则x=y ,y=z,则x=y=z。那么他们(x,y,z)就是循环节,而且循环了4次,上面的xyz和下面的z。

下面说一下我的bug。。。

  • 手写的swap居然WA了,写在头文件下面的东西找bug根本找不到啊。。。TT,找到的时候WA的一声就哭出来了。
//应该是因为疑惑运算超过int了
int min(int a,int b) { if(a<b) return a;return b;}
void swap(int a,int b) {a^=b;b^=a;a^=b;}
  • 逻辑运算少加了括号。
//注意下面的括号,丢了很严重,不要问我怎么知道的
for(int i=;i<=N;i++) Rank[sa[i]]=Rank[sa[i-]]+(A[sa[i]]==A[sa[i-]]&&B[sa[i]]==B[sa[i-]]?:);
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
using namespace std;
const int maxn=;
char ch[maxn];
int min(int a,int b) { if(a<b) return a;return b;}
struct SA
{
int Rank[maxn],sa[maxn],tsa[maxn],A[maxn],B[maxn],cntA[maxn],cntB[maxn],N;
int ht[maxn],Min[maxn][];
int sort()
{
N=strlen(ch+);
for(int i=;i<=;i++) cntA[i]=;
for(int i=;i<=N;i++) cntA[ch[i]-'a'+]++;
for(int i=;i<=;i++) cntA[i]+=cntA[i-];
for(int i=N;i>=;i--) sa[cntA[ch[i]-'a'+]--]=i;
Rank[sa[]]=;
for(int i=;i<=N;i++) Rank[sa[i]]=Rank[sa[i-]]+(ch[sa[i]]==ch[sa[i-]]?:);//这个括号不要少。
for(int l=;Rank[sa[N]]<N;l<<=){
for(int i=;i<=N;i++) cntA[i]=cntB[i]=;
for(int i=;i<=N;i++) cntA[A[i]=Rank[i]]++;
for(int i=;i<=N;i++) cntB[B[i]=i+l<=N?Rank[i+l]:]++;
for(int i=;i<=N;i++) cntA[i]+=cntA[i-],cntB[i]+=cntB[i-];
for(int i=N;i>=;i--) tsa[cntB[B[i]]--]=i;
for(int i=N;i>=;i--) sa[cntA[A[tsa[i]]]--]=tsa[i];
Rank[sa[]]=;//注意下面的括号,丢了很严重,不要问我怎么知道的
for(int i=;i<=N;i++) Rank[sa[i]]=Rank[sa[i-]]+(A[sa[i]]==A[sa[i-]]&&B[sa[i]]==B[sa[i-]]?:);
}
}
int height(){
for(int i=,j=;i<=N;i++){
if(j) j--;
while(ch[i+j]==ch[sa[Rank[i]-]+j]) j++;
ht[Rank[i]]=j;
}
}
int get_rmq()
{
for(int i=;i<=N;i++) Min[i][]=ht[i];
for(int j=;(<<j)<=N;j++){
for(int i=;i+(<<j)-<=N;i++)
Min[i][j]=min(Min[i][j-],Min[i+(<<(j-))][j-]);
}
}
int query_rmq(int L,int R)
{
if(L>R) swap(L,R); L++;
int k=log2(R-L+);
return min(Min[L][k],Min[R-(<<k)+][k]);
}
void solve()//solve这一段是抄的,说实话我觉得有点乱。。。
{
int ans=,al=,ar=;
for(int L=;L*<=N;L++){
for(int i=;L*(i+)+<=N;i++){
int x=L*i+,y=L*(i+)+;
if(ch[x]!=ch[y]) continue;
int z=query_rmq(Rank[x],Rank[y]);
int t1=y+z-,t0=;
for(int j=;j<=L-;j++){
if(x-j< || ch[x-j]!=ch[y-j]) break;
t0=x-j;int now=((t1-t0+)/L);
if(now>ans || (now==ans && Rank[t0]<Rank[al])){
ans=now;al=t0;ar=t0+now*L-;
}
}
}
}
if(ans==) printf("%c\n",ch[sa[]]);
else {
for(int i=al;i<=ar;i++) printf("%c",ch[i]);printf("\n");
}
}
}Sa;
int main()
{
int Case=;
while(~scanf("%s",ch+)){
if(ch[]=='#') return ;
printf("Case %d: ",++Case);
Sa.sort();
Sa.height();;
Sa.get_rmq();
Sa.solve();
} return ;
}

最新文章

  1. PHP之打开文件
  2. Effective Java 创建和销毁对象
  3. winrt组件库(包括翻书组件)
  4. BI中PowerDesigner建模
  5. sublime text3输入中文的问题.
  6. struts2整合jfreechart
  7. Java_Web 连接池
  8. myeclipse一些技巧
  9. SharpDevelop with Silverlight
  10. Struts2学习笔记(一) Struts2配置文件的配置
  11. TControl.GetDeviceContext会给图形控件建立新的坐标原点和建立新的剪裁区域
  12. asp.net core源码飘香:Logging组件
  13. CVE-2017-11882漏洞利用
  14. 谈谈CommonsChunkPlugin抽取公共模块
  15. JavaScript 基础学习1-day14
  16. [LeetCode] Optimal Division 最优分隔
  17. ionic安装教程
  18. Cocos2D iOS之旅:如何写一个敲地鼠游戏(八):为动画建立属性列表
  19. 服务发现 - consul 的介绍、部署和使用(转)
  20. 08-03 java 继承

热门文章

  1. HTTP状态码中301与302的区别
  2. centOS中修改语言环境
  3. 给定一颗完全二叉树,给每一层添加上next的指针,从左边指向右边
  4. SpringBoot定时任务升级篇(动态添加修改删除定时任务)
  5. 将參数从PHP传递到JavaScript中
  6. 关于TextView 的属性
  7. 解决:IOS viewDidAppear/viewWillAppear无法被调用
  8. 广播、多播和IGMP的一点记录
  9. k-anonymity
  10. Cauchy sequence Hilbert space 希尔波特空间的柯西序列