Pagini recente » Cod sursa (job #2547435) | Cod sursa (job #169139) | Cod sursa (job #87658) | Cod sursa (job #1676351) | Cod sursa (job #1756886)
#include <cstdio>
#include <cstring>
#define NMax 505
#define Type 256
#define MIN(a,b)((a)<(b)?(a):(b))
char s[NMax+1];
int pos_st[NMax+1][Type+1];
int pos_dr[NMax+1][Type+1];
int ultim[2][NMax+1];
int ap[Type+1];
int N,ans;
void Solve(int v)
{
int i,j,z,l,ok=v%2,t=0;
for(i = 0; i <= 1; ++i)
for(j = 1; j <= N; ++j) ultim[i][j] = 0;
if(v%2)
for(i = 1; i <= N; ++i) { ultim[0][i] = i; }
else
for(i = 1; i <= N; ++i)
if( pos_dr[i][ s[i] ] ) { ultim[0][i] = pos_dr[i][ s[i] ]; ok = 1; t = 1; }
for(l = 1, i = 2+v; i <= N && ok; i+=2, l=1-l)
{
ok = 0;
for(j = 1; j <= N; ++j)
for(z = 'a'; z <= s[j]; ++z)
if( ultim[1-l][j] && pos_st[j][z] && pos_dr[ ultim[1-l][j] ][z] )
{
if( ultim[l][ pos_st[j][z] ] ) ultim[l][ pos_st[j][z] ] = MIN( pos_dr[ ultim[1-l][j] ][z], ultim[l][ pos_st[j][z] ] );
else ultim[l][ pos_st[j][z] ] = pos_dr[ ultim[1-l][j] ][z];
ok = 1;
}
for(j = 1; j <= N; ++j) ultim[1-l][j] = 0;
if(!ok) break;
}
if(i==4) { if(2>ans && t) ans = 2; }
else if(i-2>ans) ans = i-2;
}
int main(){
freopen("palm.in","r",stdin);
freopen("palm.out","w",stdout);
int i,z;
s[0] = 1;
fgets( s+1, NMax, stdin );
N = strlen(s)-1;
if( s[N]=='\n' ) --N;
for(i = 1; i <= N; ++i)
{
for(z = 'a'; z <= 'z'; ++z) pos_st[i][z] = ap[z];
ap[ s[i] ] = i;
}
memset( ap, 0, sizeof(ap) );
for(i = N; i >= 1; --i)
{
for(z = 'a'; z <= 'z'; ++z) pos_dr[i][z] = ap[z];
ap[ s[i] ] = i;
}
Solve(1);
Solve(2);
printf("%d\n",ans);
return 0;
}