Pagini recente » Cod sursa (job #1220952) | Cod sursa (job #1379323) | Cod sursa (job #345451) | Cod sursa (job #1118911) | Cod sursa (job #332824)
Cod sursa(job #332824)
#include<stdio.h>
#include<fstream>
#include<string.h>
#define max(a,b) a>b?a:b
using namespace std;
int nr[2000010],N;
char text[1000010];
unsigned long long int sol;
void impar(int x){
int i,n,m;
for(i=x+nr[2*x-1];(i<=N)&&(i<=2*x-1);i++)
if(text[i]==text[x-(i-x)]){
nr[2*x-1]++;
n=x+(i-x)/2+1;
m=x-(i-x)/2-1;
nr[2*n-1]=max(nr[2*n-1],nr[2*m-1]);}
else
return;
}
void par(int x){
int i,n,m;
for(i=x+nr[2*x];i<=N&&i+1<(2*x);i++)
if(text[i]==text[x-(i-x+1)])
{nr[2*x]++;
n=x+(i-x+1)/2+1;
m=x-(n-x+1);
nr[2*n-1]=max(nr[2*m-1],nr[2*n-1]);
}
else
return;
}
int main(){
ifstream f("pscpld.in");
freopen ("pscpld.out","w",stdout);
int i;
f>>text+1;
N=strlen(text+1);
for(i=1;i<=N;i++)
{nr[2*i-1]=max(1,nr[2*i-1]);
if(text[i]==text[i-1])
nr[2*i]=max(nr[2*i],1);
impar(i);
par(i);
sol+=nr[2*i]+nr[2*i-1];
}
printf("%lld",sol);
return 0;}