| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
蒙混过关,请路过大虾指正//poj2774
#include <iostream>
using namespace std;
const int Max = 200010;
char str[Max];
int height[Max],mem[4][Max];
int *s1,*s2,*R,*B,len;
void Initial()
{
memset(mem,0,sizeof(mem));
s1=mem[0];
s2=mem[1];
R=mem[2];
B=mem[3];
len = strlen(str);
str[len++]='a'-1;
}
void CreateSuffixArray()
{
int i,h,h2,*T;
Initial();
for(i=0;i<256;++i) B[i]=0;
for(i=0;i<len;++i) B[str[i]]++;
for(i=1;i<256;++i) B[i]+=B[i-1];
for(i=0;i<len;++i) s1[ --B[str[i]] ] = i;
for(R[s1[0]]=0,i=1; i<len; ++i){
if(str[ s1[i] ] == str[ s1[i-1] ]) R[ s1[i] ] = R[ s1[i-1] ];
else R[ s1[i] ] = R[ s1[i-1] ] + 1;
}
//printf("log(n) loops:\n");
for(h=1; h<len && R[ s1[len-1] ] < len-1; h<<=1){
//printf("\nh=%d\n",h);
//for(i=0;i<len;++i)printf("s1[%d]=%d\n",i,s1[i]);
//system("pause");
for(i=0; i<len; ++i) B[ R[s1[i]] ] = i;
for(i=len-1; i>=0; i--){
if(h <= s1[i]) s2[ B[R[s1[i]-h]]-- ] = s1[i]-h;
}
for(i=len-h, h2 = len - (h>>1); i<h2; ++i) s2[ B[R[i]] ] = i;
T=s1; s1=s2; s2=T;
for(B[s1[0]]=0, i=1; i<len; ++i ){
if( R[s1[i]] != R[s1[i-1]] || R[s1[i]+h] != R[s1[i-1]+h]) B[s1[i]] = B[s1[i-1]]+1;
else B[s1[i]] = B[s1[i-1]];
}
T=B; B=R; R=T;
}
}
void CalculateHeight()
{
int i,j,k;
for(k=0,i=0; i<len; ++i){
if(R[i]==0) height[0]=0;
else {
for(j=s1[R[i]-1]; str[i+k]==str[j+k]; ++k);
height[R[i]]=k;
if(k>0)k--;
}
}
}
int main()
{
char c;
int ans,i,d,s,k,cs=0;
while(true){
gets(str);
cs++;
if(strcmp(str,"#")==0)break;
CreateSuffixArray();
//for(int i=0;i<len;++i)puts( str+(s1[i]) );
//system("pause");
CalculateHeight();
//for(i=0;i<len;++i)printf("height[%d]=%d\n",i,height[i]);
//system("pause");
d=ans=0;
for(i=1;i<len;++i){
int t=height[i];
for(int j=i;j<len && t>0 && height[j]>=t;++j){
if( s1[j] > s1[i-1] ){
k=s1[j]-s1[i-1];
if( t/k > ans){
ans = t / k;
s = s1[i-1];
d = k;
}
}
else{
k=s1[i-1]-s1[j];
if( t/k > ans){
ans = t / k;
s = s1[j];
d = k;
}
}
}
}
printf("Case %d: ",cs);
if(ans != 0){
//printf("s=%d d=%d ct=%d\n",s,d,ans);
d*=ans+1;
for(i=0;i<d; i++)putchar(str[s+i]);
}
else{
c=str[0];
for(i=1;i<len-1;++i){
if( c>str[i] )c=str[i];
}
putchar(c);
}
putchar('\n');
}
//system("pause");
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator