Pagini recente » Cod sursa (job #618259) | Cod sursa (job #2119699) | Cod sursa (job #599030) | Cod sursa (job #431233) | Cod sursa (job #1003434)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int MAX_N=2000100;
char sir[MAX_N];
char s[MAX_N];
int d[MAX_N];
void extinde(int i) {
while(sir[i+d[i]+1]==sir[i-d[i]-1] && d[i]<i ) {
d[i]++;
}
}
void get_sir() {
int n=strlen(s);
int sz=0;
sir[sz]='#';
for(int i=0;i<n;i++) {
sir[++sz]=s[i];
sir[++sz]='#';
}
}
int main() {
freopen("pscpld.in","r",stdin);
freopen("pscpld.out","w",stdout);
scanf("%s",s);
get_sir();
int n=strlen(sir+1);
int p=0;
long long sol=0;
for(int i=1;i<=n;i++) {
if(p+d[p]<i) {
extinde(i);
}
else if( (p-(i-p))-d[p-(i-p)]<=p-d[p]) {
d[i]=d[p]-(i-p);
extinde(i);
}
else if( (p-(i-p))-d[p-(i-p)]>p-d[p]) {
d[i]=d[p-(i-p)];
}
if(i+d[i]>p+d[p]) {
p=i;
}
sol+=(d[i]+1)/2;
//printf("%d ",d[i]);
}
printf("%lld",sol);
return 0;
}