Pagini recente » Cod sursa (job #2387051) | Cod sursa (job #1011860) | Cod sursa (job #1998824) | Cod sursa (job #530570) | Cod sursa (job #1536197)
#include<cstdio>
#define N 1000000
using namespace std;
char s[2*N+1];
char aux[N+1];
int dp[2*N+1];
int min(int a,int b){
return a<b ? a : b;
}
int main(){
freopen ("pscpld.in","r",stdin);
freopen ("pscpld.out","w",stdout);
int n,i,p,m;
long long cnt;
gets(aux);
s[1]='#';
n=2;
i=0;
while(aux[i]!='\n' &&aux[i]!='\0'){
s[n+1]='#';
s[n]=aux[i];
i++;
n+=2;
}
n--;
p=0;
m=0;
cnt=0;
for(i=1;i<=n;i++){
if (p<i){
p=i;
while(s[p+1]==s[i-(p-i)-1] &&p<n) p++;
dp[i]=p-i+1;
m=i;
}
else {
dp[i]=min(dp[m-(i-m)],p-i+1);
if (i+dp[i]-1==p){
while(s[p+1]==s[i-(p-i)-1] &&p<n) p++;
m=i;
dp[i]=p-i+1;
}
}
cnt=cnt+dp[i]/2;
}
printf ("%lld",cnt);
return 0;
}