Pagini recente » Cod sursa (job #2197040) | Cod sursa (job #3242753) | Cod sursa (job #800566) | Cod sursa (job #2325037) | Cod sursa (job #1345744)
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
const int NMAX = 1000000;
int p[NMAX * 2 + 5];
string v, s;
inline void solve(int poz, int n) {
while(poz - p[poz] >= 0 && poz + p[poz] < n && v[poz - p[poz]] == v[poz + p[poz]])
++ p[poz];
-- p[poz];
}
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
int n, j = 0, aux, st, dr;
long long rasp = 0;
cin >> s;
n = s.length();
for(int i = 0; i < n; ++ i) {
v = v + "#" + s[i];
}
v += "#";
n = n * 2 + 1;
for(int i = 1; i < n - 1; ++ 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("%lld", rasp);
return 0;
}