/*
* =====================================================================================
*
* Filename: c.cpp
* Version: 1.0
* Created: 08/20/2013 03:06:41 PM
* Revision: none
* Compiler: GNU C++
*
* Just like you,wait you forever~~
*
* =====================================================================================
*/
#include <set>
#include <map>
#include <list>
#include <queue>
#include <stack>
#include <cmath>
#include <string>
#include <cstdio>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define PB push_back
#define SIZE(x) (int)x.size()
#define clr(x,y) memset(x,y,sizeof(x))
#define MP(x,y) make_pair(x,y)
#define RS(n) scanf ("%s", n)
#define ALL(t) (t).begin(),(t).end()
#define FOR(i,n,m) for (int i = n; i <= m; i ++)
#define ROF(i,n,m) for (int i = n; i >= m; i --)
#define IT iterator
#define FF first
#define SS second
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef vector<int> vint;
typedef vector<string> vstring;
typedef pair<int, int> PII;
void RI (int& x){
x = 0;
char c = getchar ();
while (c == ' '||c == '\n') c = getchar ();
bool flag = 1;
if (c == '-'){
flag = 0;
c = getchar ();
}
while (c >= '0' && c <= '9'){
x = x * 10 + c - '0';
c = getchar ();
}
if (!flag) x = -x;
}
void RII (int& x, int& y){RI (x), RI (y);}
void RIII (int& x, int& y, int& z){RI (x), RI (y), RI (z);}
/**************************************END define***************************************/
const ll mod = 1e9+7;
const ll LINF = 1e18;
const int INF = 1e9;
const double EPS = 1e-8;
const int maxn = 100005;
int sa[maxn],r[maxn];
int cmp(int *r,int a,int b,int l)//
{
return r[a]==r[b]&&r[a+l]==r[b+l];
}
int wa[maxn],wb[maxn],wv[maxn],ws1[maxn];
void makesa (int n,int m)//
{
r[n++]=0;
int i,j,p,*x=wa,*y=wb,*t;
for(i=0; i<m; i++)ws1[i]=0;
for(i=0; i<n; i++)ws1[x[i]=r[i]]++;
for(i=1; i<m; i++)ws1[i]+=ws1[i-1];
for(i=n-1; i>=0; i--)sa[--ws1[x[i]]]=i;
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++) wv[i]=x[y[i]];
for(i=0; i<m; i++) ws1[i]=0;
for(i=0; i<n; i++) ws1[wv[i]]++;
for(i=1; i<m; i++) ws1[i]+=ws1[i-1];
for(i=n-1; i>=0; i--) sa[--ws1[wv[i]]]=y[i];
for(t=x,x=y,y=t,p=1,x[sa[0]]=0,i=1; i<n; i++)
x[sa[i]]=cmp(y,sa[i-1],sa[i],j)?p-1:p++;
}
}
int rank[maxn],height[maxn];
void calheight(int n)
{
int i,j,k=0;
for(i=1; i<=n; i++)rank[sa[i]]=i;
for(i=0; i<n; height[rank[i++]]=k)
for(k?k--:0,j=sa[rank[i]-1]; r[i+k]==r[j+k]; k++);
}
int dp[20][100005];
void rmqinit (int n){
FOR (i, 1, n){
dp[0][i] = height[i];
}
int len = floor (log2 (100005));
FOR (j, 1, len){
for (int i = 1; i + (1 << j) - 1 <= maxn; i ++){
dp[j][i] = min (dp[j-1][i], dp[j-1][i+(1<<(j-1))]);
}
}
}
int lcp(int i,int j)
{
int m = min (rank[i], rank[j])+1;
int n = max (rank[i], rank[j]);
int len = floor (log(n-m+1)/log(2));
return min (dp[len][m], dp[len][n-(1<<len)+1]);
}
char s[maxn];
int n;
int main (){
int cass = 1;
while (gets (s), s[0] != '#'){
int len = strlen (s);
FOR (i, 0, len-1){
r[i] = s[i];
}
makesa (len, 'z'+1);
calheight (len);
rmqinit (len);
vint vec;
int cnt = 0;
FOR (i, 1, len){
for (int j = 0; j+i <= len; j += i){
int cp = lcp (j, j+i);
int l = cp/i + 1;
int t = j - (i-cp%i);
if (t >= 0) l = max (l, lcp (t, t+i)/i+1);
if (l > cnt){
cnt = l;
vec.clear ();
vec.PB (i);
}else if (l == cnt){
if (i != *(vec.rbegin ())){
vec.PB (i);
}
}
}
}
//cout << cnt << endl;
int flag = 1, pos, tl;
FOR (i, 1, len){
if (!flag) break;
FOR (j, 0, SIZE (vec)-1){
int num = vec[j];
int p = sa[i];
if (p+num <= len){
int cp = lcp (p, p+num);
int l = cp/num + 1;
if (l == cnt){
pos = sa[i];
tl = vec[j];
flag = 0;
break;
}
}
}
}
printf ("Case %d: ", cass ++);
FOR (i, pos, pos + tl*cnt - 1){
putchar (s[i]);
}
putchar ('\n');
}
}
poj 3693 (后缀数组)
最新推荐文章于 2020-04-02 09:56:14 发布