Pagini recente » Cod sursa (job #2077968) | Cod sursa (job #3126345) | Cod sursa (job #1907239) | Diferente pentru implica-te/arhiva-educationala intre reviziile 124 si 123 | Cod sursa (job #1003432)
#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;
int 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("%d",sol);
return 0;
}