Pagini recente » Cod sursa (job #259828) | Cod sursa (job #75427) | Cod sursa (job #1802848) | Cod sursa (job #1475589) | Cod sursa (job #1519149)
#include <cstdio>
#include <cstring>
using namespace std;
const int NMAX = 1000000;
int p[2 * NMAX + 5];
char ss[NMAX + 5], s[NMAX * 2 + 5];
void solve(int poz, int n) {
while(poz - p[poz] > 0 && poz + p[poz] <= n && s[poz - p[poz]] == s[poz + p[poz]])
++ p[poz];
-- p[poz];
}
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
gets(ss + 1);
int n = strlen(ss + 1), j = 1, aux, st, dr, rasp = 0;
for(int i = 1; i <= n; ++ i) {
if(j % 2 == 1) {
s[j] = '#';
++ j;
}
s[j] = ss[i];
++ j;
}
s[j] = '#';
n = j;
j = 1;
for(int i = 2; i < n; ++ i) {
aux = 2 * j - i;
st = j - p[j];
dr = j + p[j];
if(i > dr) {
solve(i, n);
j = i;
} else
if(aux - p[aux] > st) {
p[i] = p[aux];
} else {
p[i] = dr - i;
solve(i, n);
j = i;
}
rasp +=( p[i] + 1 )/ 2;
}
printf("%d", rasp);
return 0;
}