Pagini recente » Cod sursa (job #1938284) | Cod sursa (job #659554) | Cod sursa (job #2732114) | Cod sursa (job #415649) | Cod sursa (job #956698)
Cod sursa(job #956698)
#include <cstdio>
using namespace std;
const int MAX_N = 1000100;
char aux[MAX_N];
char s[MAX_N*2 + 100];
int best[MAX_N*2 + 100];
long long show = 0;
int main()
{
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
scanf("%s",aux);
int i,cr,j,k;
bool found;
int st,dr;
s[0] = ' ';
for(i = 0,cr = 1; aux[i] ; ++ i){
s[cr++] = aux[i];
s[cr++] = ' ';
}
st = dr = 0;
for(i = 0 ; i < cr ; ){
while(st >= 0 && dr <= cr && s[st] == s[dr])
--st,++dr;
st++,dr--;
best[i] = dr-st+1;
found = 0;
for(j = i-1 ; j >= st; -- j){
if(j - best[j]/2 == st){
found = 1;
int aux = j + best[j]/2;
st = 2*i-aux;
i = 2*i-j;
break;
}else if(j - best[j]/2 > st){
best[2*i-j] = best[j];
}else{
int aux = j - st;
best[2*i-j] = aux*2+1;
}
}
if(!found){
i = dr+1;
st = dr = i;
}
}
for(i = 0 ; i <cr ; ++ i)
show += ((best[i])/2 + 1) /2;
printf("%lld\n",show);
return 0;
}