Pagini recente » Cod sursa (job #3283208) | Cod sursa (job #1103721) | Cod sursa (job #817086) | Cod sursa (job #2014639) | Cod sursa (job #641344)
Cod sursa(job #641344)
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
#define ALF 26
#define MAX_N 510
ifstream f("palm.in");
ofstream g("palm.out");
int n;
int next[ALF][MAX_N], prev[ALF][MAX_N], c[MAX_N][MAX_N];
char s[MAX_N];
void get_next_prev() {
for (int i = 1; i <= n; i++)
next[s[i] - 'a'][i] = prev[s[i] - 'a'][i] = i;
for (int i = 0; i < 26; i++) {
prev[i][0] = -1;
for (int j = 1; j <= n; j++)
if (prev[i][j] == 0)
prev[i][j] = prev[i][j - 1];
next[i][n + 1] = n + 1;
for (int j = n; j > 0; j--)
if (next[i][j] == 0)
next[i][j] = next[i][j + 1];
}
}
int solve() {
get_next_prev();
int ans = 0;
for (int L = 1; L <= n; L++)
for (int i = 1; i + L - 1 <= n; i++) {
int j = i + L - 1;
if (s[i] == s[j]) {
int val = 0;
for (int letter = s[i] - 'a'; letter < 26; letter++)
if (next[letter][i + 1] <= prev[letter][j - 1])
val = max(val, c[next[letter][i + 1]][prev[letter][j - 1]]);
c[i][j] = val + 1 + (i != j);
if (next[s[i] - 'a'][i + 1] <= j)
c[i][j] = max(c[i][j], c[next[s[i] - 'a'][i + 1]][j]);
if (i <= prev[s[j] - 'a'][j - 1])
c[i][j] = max(c[i][j], c[i][prev[s[j] - 'a'][j - 1]]);
ans = max(ans, c[i][j]);
}
}
return ans;
}
int main() {
f >> (s + 1); s[0] = ' '; n = strlen(s) - 1;
g << solve() << "\n";
return 0;
}