Pagini recente » Cod sursa (job #1756658) | Cod sursa (job #1699479) | Cod sursa (job #2652255) | Cod sursa (job #1814089) | Cod sursa (job #894691)
Cod sursa(job #894691)
#include<cstring>
#include<cstdio>
#include<algorithm>
#define NMAX 1000000+5
using namespace std;
char s[2*NMAX],S[NMAX];
int i,j,l,r,p[2*NMAX],n,M,C;
long long sol;
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
scanf("%s",S+1);
for(i=1,n=1;S[i];i++,n++) {s[n]=S[i]; p[n]=1; n++;}
s[0]='#'; s[n]='*'; n--;
for(i=1;i<=n;i++)
{
if(i<=M) p[i]=min(p[2*C-i],M-i+1);
l=i-p[i]; r=i+p[i];
for(l--,r++;s[l]==s[r];l-=2,r+=2);
l+=2,r-=2;
p[i]=(r+1)/2-(l+1)/2+1;
if(r>M) {M=r; C=i;}
sol+=(p[i]+1)/2;
}
printf("%lld\n",sol);
return 0;
}