Pagini recente » Cod sursa (job #969849) | Cod sursa (job #1971144) | Cod sursa (job #2328068) | Cod sursa (job #1909044) | Cod sursa (job #2151366)
#include <cstdio>
#include <cstring>
#include <cassert>
using namespace std;
char ss[1000005], s[2000005];
int p[2000005];
void solve(int poz, int n) {
while(poz + p[poz] <= n && poz - p[poz] > 0 && s[poz + p[poz]] == s[poz - p[poz]]) {
++ p[poz];
}
-- p[poz];
}
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
int n, aux, j, st, dr;
long long rasp = 0;
gets(ss);
n = strlen(ss);
aux = 0;
assert(n < 500000);
for(int i = 0; i < n; ++ i) {
aux += 2;
s[aux] = ss[i];
}
++ aux;
n = aux;
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 {
solve(i, n);
j = i;
}
rasp += (p[i] + 1) / 2;
}
printf("%lld", rasp);
return 0;
}