Pagini recente » Cod sursa (job #377216) | Cod sursa (job #1217035) | Cod sursa (job #1354951) | Cod sursa (job #2664025) | Cod sursa (job #637155)
Cod sursa(job #637155)
#include <stdio.h>
#include <string.h>
#define LMAX 1 << 9
int D[2][LMAX], last[LMAX], x[LMAX];
char s[LMAX];
bool used[LMAX];
int main ()
{
int N, i, j, it, k;
freopen ("palm.in", "r", stdin);
freopen ("palm.out", "w", stdout);
gets (s + 1);
N = strlen (s + 1);
for (i = 1; i <= N; i ++)
x[i] = s[i] - 'a';
for (i = 1; i <= N; i ++)
{
for (j = i - 1; j >= 1; j --)
if (x[j] <= x[i] && ((D[0][i] == 0 && D[1][i] == 0) || D[1][j]))
{
if (!last[j])
last[j] = N;
for (k = last[j] - 1; k >= i + 1; k --)
if (x[k] == x[i] && !used[k])
break;
if (k < i)
continue;
if (k == i && !D[1][i])
{
if (D[1][j] + 1 > D[0][i])
{
D[0][i] = D[1][j] + 1;
used[k] = 1;
}
}
else
if (D[1][j] + 2 > D[1][i])
{
D[1][i] = D[1][j] + 2;
last[i] = k;
used[i] = used[k] = 1;
}
}
if (D[0][i] == 0 && D[1][i] == 0)
{
for (j = N; j >= i + 1; j --)
if (x[j] == x[i])
break;
if (j == i)
{
D[0][i] = 1;
used[j] = 1;
}
else
{
D[1][i] = 2;
used[i] = used[j] = 1;
last[i] = j;
}
}
}
int max = 0;
for (i = 1; i <= N; i ++)
{
if (D[0][i] > max)
max = D[0][i];
if (D[1][i] > max)
max = D[1][i];
}
printf ("%d", max);
return 0;
}