Pagini recente » Cod sursa (job #2553015) | Cod sursa (job #1483309) | Cod sursa (job #427309) | Cod sursa (job #2353407) | Cod sursa (job #998581)
Cod sursa(job #998581)
#include<cstdio>
#include<cstring>
using namespace std;
int n,i,P,R,dp[1000009];
long long rez;
char sir[1000009];
int min(int a,int b){if(a<b) return a;return b;}
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
gets(sir+1);
n=strlen(sir+1);
R=0;
for(i=1;i<=n;i++)
{
if(R>=i) dp[i]=min(dp[P-(i-P)],R-i+1);
while(sir[i-dp[i]]==sir[i+dp[i]]&&i>dp[i]&&i+dp[i]<=n) dp[i]++;
if(i+dp[i]-1>R)
{
R=i+dp[i]-1;
P=i;
}
rez+=dp[i];
}
R=0;
for(i=1;i<n;i++)
{
dp[i]=0;
if(R>i) dp[i]=min(dp[P-(i-P)],R-i);
while(sir[i-dp[i]]==sir[i+dp[i]+1]&&i>dp[i]&&i+dp[i]+1<=n) dp[i]++;
if(i+dp[i]>R)
{
R=i+dp[i];
P=i;
}
rez+=dp[i];
}
printf("%lld\n",rez);
return 0;
}