Pagini recente » Cod sursa (job #1907815) | Cod sursa (job #1605004) | Cod sursa (job #1648473) | Cod sursa (job #1795246) | Cod sursa (job #1481398)
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAX_N = 1000000;
char BUFF[MAX_N + 1];
char S[2*MAX_N + 10];
int D[2*MAX_N + 5], rightmost, iRightmost;
int starSum[2*MAX_N + 5];
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
int i, j, n, k;
gets(BUFF); n = strlen(BUFF);
for(i = 1, j = 0; i < 2*n; i++) {
if(i & 1) S[i] = BUFF[j++];
else S[i] = '*';
starSum[i] = starSum[i-1];
if(S[i] == '*') starSum[i]++;
}
n = 2*n-1; rightmost = 1; iRightmost = 1; D[1] = 0;
for(i = 2; i <= n; i++) {
if(i > rightmost) {
for(j = 1; S[i-j] == S[i+j] && i + j <= n; j++);
rightmost = i + j - 1;
iRightmost = i;
D[i] = j - 1;
}
else {
j = 2*iRightmost - i;
if(i + D[j] < rightmost) D[i] = D[j];
else {
for(j = rightmost - i + 1; S[i-j] == S[i+j] && i + j <= n; j++);
if(i + j - 1 > rightmost) rightmost = i + j - 1, iRightmost = i;
D[i] = j - 1;
}
}
}
long long ans = 0;
for(i = 1; i <= n; i++)
ans += (D[i] + 1 - starSum[i+D[i]] + starSum[i-1]);
printf("%lld\n", ans);
return 0;
}