Pagini recente » Cod sursa (job #1328657) | Cod sursa (job #900385) | Cod sursa (job #767028) | Cod sursa (job #1178871) | Cod sursa (job #261323)
Cod sursa(job #261323)
#include <iostream>
#include <fstream>
using namespace std;
const char iname[] = "pscpld.in";
const char oname[] = "pscpld.out";
const int MAXN = 2000005;
#define Min(a, b) ((a) < (b) ? (a) : (b))
char S[MAXN]; int Lg[MAXN];
int main(void) {
ifstream in(iname);
int n = 0;
while (in >> S[2 * n + 1]) {
Lg[2 * n + 1] = -1;
n ++;
}
in.close();
ofstream out(oname);
long long res = 0;
for (int i = 1; i < 2 * n; ++ i) {
if ((i & 1) && Lg[i] == -1)
Lg[i] = 1;
int j = Lg[i] + 1, k = Lg[i];
while (i - j >= 1 && i + j < 2 * n && S[i - j] == S[i + j])
j += 2;
j -= 2;
while (k <= j) {
Lg[i + k] = Min(Lg[i - k], j-k+1);
k ++;
}
Lg[i] = j + 1;
res += (Lg[i] + 1) / 2;
}
out << res;
in.close(), out.close();
return 0;
}