Pagini recente » Cod sursa (job #2370802) | Cod sursa (job #1629133) | Cod sursa (job #1941287) | Cod sursa (job #2601155) | Cod sursa (job #904803)
Cod sursa(job #904803)
#include <cstdio>
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <sstream>
#include <iomanip>
#include <cmath>
#include <cstdlib>
#include <ctype.h>
#include <cstring>
#include <ctime>
#include <cassert>
#include <utility>
using namespace std;
#define MAXN 1000005
char s[MAXN];
char T[2 * MAXN];
int P[2 * MAXN];
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out","w", stdout);
fgets(s, sizeof(s), stdin);
int N = 0;
for(int i = 0; s[i] != '\0' && s[i] != '\n'; i++) {
N++;
T[2 * i] = s[i];
T[2 * i + 1] = '#';
}
long long ans = 0;
int R = 0;
int C = 0;
for(int i = 0; i < 2 * N; i++) {
int pi = C - (i - C);
if(R <= i)
P[i] = 1;
else
P[i] = min(R - i + 1, P[pi]);
while(i - P[i] >= 0 && i + P[i] < 2 * N && T[i - P[i]] == T[i + P[i]])
P[i]++;
if(i + P[i] - 1 > R) {
C = i;
R = i + P[i] - 1;
}
if((i & 1) == 0)
ans += (P[i] + 1) / 2;
else
ans += P[i] / 2;
}
printf("%lld\n", ans);
return 0;
}