Pagini recente » Cod sursa (job #2644081) | Cod sursa (job #629352) | Cod sursa (job #1893186) | Cod sursa (job #3144917) | Cod sursa (job #1227497)
#include <cstdio>
#include <cstring>
using namespace std;
int v[1000111];
char s[1000111];
inline int min(int a, int b) {
if (a<b) return a;
else return b;
}
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
scanf("%s", s+1);
int n = strlen(s+1);
int st = 1;
int dr = 1;
long long Rez = 0;
for (int j =1 ; j<=n; Rez += v[j++]+1)
if (j<=dr) {
v[j] = min(v[st+dr-j], dr - j);
if (j+v[j] == dr)
for (st = j - v[j], dr = j + v[j]; st > 1 && dr < n && s[st - 1] == s[dr + 1]; --st, ++dr)
v[j] += 1;
}
else {
for (st = dr = j; st > 1 && dr < n && s[st - 1] == s[dr + 1]; --st, ++dr)
v[j] += 1;
}
st =1;
dr = 2;
for (int j = 1; j<n; ++j) {
if (s[j] == s[j+1]) {
if (j<=dr) {
v[j] = min (v[st + dr - j - 1], dr - j - 1);
for (st = j - v[j], dr = j + v[j] + 1; st > 1 && dr < n && s[st - 1] == s[dr + 1]; --st, ++dr)
v[j] += 1;
} else {
for (dr = (st = j) + 1; st > 1 && dr < n && s[st - 1] == s[dr + 1]; --st, ++dr)
v[j] += 1;
}
Rez+=v[j]+1;
}
else v[j] = 0;
}
printf("%lld", Rez);
return 0;
}