Pagini recente » Cod sursa (job #324760) | Cod sursa (job #2570714) | Cod sursa (job #1828620) | Cod sursa (job #534619) | Cod sursa (job #1003377)
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define LL long long
#define NMAX 2000007
using namespace std;
LL Ans;
int D[NMAX], Last, Nr;
char a[NMAX], A[NMAX];
int main(){
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
scanf("%s", a);
for(int i = 0; i < strlen(a); ++ i){
A[++ Nr] = a[i];
if(i != strlen(a) - 1)
A[++ Nr] = '*';
}
A[++ Nr] = '*';
for(int i = 1; i <= Nr; ++ i){
if(i == 1){
D[i] = 1;
Last = 1;
}
else
D[i] = max(min(D[Last - (i - Last)] - 1, Last + D[Last] - i), 1);
int St = i - D[i], Dr = i + D[i];
while(St >= 1 && Dr <= Nr && A[St] == A[Dr]){
++ D[i];
-- St;
++ Dr;
}
if(A[i] == '*')
Ans += D[i] / 2;
else
Ans += (D[i] + 1) / 2;
if(i + D[i] > Last + D[i])
Last = i;
}
printf("%lld", Ans);
}