Pagini recente » Cod sursa (job #2329375) | Cod sursa (job #2320211) | Cod sursa (job #2331955) | Cod sursa (job #2512887) | Cod sursa (job #2398217)
#include <stdio.h>
#include <iostream>
using namespace std;
FILE *in,*out;
int n,lps[2000005],sol;
char s[2000005];
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+=lps[i]/2;
if(r<i+lps[i])
r=i+lps[i],c=i;
}
fprintf(out,"%d",sol);
}
int main(){
in=fopen("pscpld.in","r");
out=fopen("pscpld.out","w");
read();
solve();
return 0;
}