Pagini recente » Cod sursa (job #389106) | Cod sursa (job #754423) | Cod sursa (job #2253610) | Cod sursa (job #3221075) | Cod sursa (job #645012)
Cod sursa(job #645012)
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Nmax 1000002
using namespace std;
char v[Nmax];
int l[2*Nmax],s[2*Nmax],st,dr;
long long sol;
int main(){
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
fgets(v,Nmax,stdin);
if(v[strlen(v)-1]=='\n')
v[strlen(v)-1]='\0';
int N=strlen(v)-1;
for(int i=0;i<=2*N;++i){
//vedem daca e cuprins in palindroamele gasite deja
while(st<=dr && s[st]+l[s[st]] - i%2 < i)
st++;
//daca este cuprins in palindrom, luam valoare
if(st<=dr)
l[i]=min(l[s[st]-(i-s[st])],s[st]+l[s[st]]-i-st%2+1);
int d=(l[i]/2);
bool ok=0;
while( i+d+1<2*(N+1) && i/2+d+1<=N && i/2-d-1 + i%2>=0 && v[i/2+d+1]==v[i/2-d-1 + i%2] ){
++d;
ok=1;
}
if(ok || l[i]==0)
l[i]=2*d+(1-i%2);
//stergem palindroamele anterioare daca nu sunt de lungime maxim
while(i+l[i] - i%2 >= s[dr]+l[s[dr]]/2 && dr>=st)
--dr;
//salvam palindromul curent
if(i+l[i] - i%2 > s[dr]+l[s[dr]]/2 || dr<st )
s[++dr]=i;
sol+=l[i]/2+1-i%2;
}
printf("%lld",sol);
return 0;
}