Pagini recente » Cod sursa (job #1502473) | Cod sursa (job #2451957) | Cod sursa (job #2254577) | Cod sursa (job #2203050) | Cod sursa (job #1165303)
#include<stdio.h>
#include<string.h>
const int N=1000001;
using namespace std;
FILE *f,*g;
char c[2*N]; int dr[2*N];
int n,sum,max;
void read(void){
f=fopen("pscpld.in","r");
g=fopen("pscpld.out","w");
fscanf(f,"%s",c);
n=strlen(c);
int i;
for(i=2*n-1;i>=1;i-=2) c[i]=c[i/2];
for(i=2*n;i>=0;i-=2) c[i]='#';
n=2*n;
}
void afla(int i){
int aux; int curr;
if (dr[max]>=i){
aux=2*max-i;
if (dr[aux] < aux+dr[max]-i) {dr[i]=dr[aux]-aux+i; sum+=(dr[i]-i+1)/2; return;}
else curr=dr[max]+1;
}
else curr=i+1;
while(curr<=n && 2*i>=curr && c[curr] == c[2*i-curr]) curr++;
dr[i]=curr-1;
max=i;
if (i%2 == 1) sum+=(dr[i]-i+1)/2;
else sum+=(dr[i]-i+1)/2;
}
void solve(void){
max=0; dr[max]=0;
int i;
for(i=1;i<=n-1;i++) afla(i);
fprintf(g,"%d",sum);
}
int main(void){
read();
solve();
return 0;
}