Pagini recente » Cod sursa (job #2334354) | Cod sursa (job #2221210) | Cod sursa (job #150124) | Cod sursa (job #1171310) | Cod sursa (job #2398223)
#include <stdio.h>
#include <iostream>
using namespace std;
FILE *in,*out;
int n,lps[2000015];
long long sol;
char s[2000015];
void read(){
char c=fgetc(in);
s[0]='#';
while(!feof(in)){
s[++n]=c;
s[++n]='#';
c=fgetc(in);
}
}
void solve(){
int r,c,ii;
bool expand;
lps[1]=1;
for(int i=2;i<=n;i++){
if(i%2)
sol++;
ii=2*c-i;
expand=0;
if(i>=r){
lps[i]=0;
expand=1;
}
else{
if(lps[ii]<r-i)
lps[i]=lps[ii];
else{
lps[i]=min(r-i,lps[ii]);
expand=1;
}
}
if(expand){
while(i-lps[i]>0 && i+lps[i]<n){
if((i-lps[i]-1)%2==0)
lps[i]++;
else{
if(s[i-lps[i]-1]==s[i+lps[i]+1])
lps[i]++;
else
break;
}
}
}
sol+=1ll*lps[i]/2;
if(r<i+lps[i])
r=i+lps[i],c=i;
}
fprintf(out,"%lld",sol);
}
int main(){
in=fopen("pscpld.in","r");
out=fopen("pscpld.out","w");
read();
solve();
return 0;
}