Pagini recente » Cod sursa (job #2028715) | Cod sursa (job #1355989) | Cod sursa (job #90646) | Cod sursa (job #1319195) | Cod sursa (job #790328)
Cod sursa(job #790328)
#include <fstream>
#include <string>
#include <iostream>
const int MAX_N = 1000005;
std::ifstream fin;
std::ofstream fout;
std::string s;
int l[2*MAX_N];
int N;
long long result;
inline int min(int a, int b) {
return a > b ? b : a;
}
inline int max(int a, int b) {
return a > b ? a : b;
}
int main(int argc, char const *argv[]) {
fin.open("pscpld.in");
N = 1;
char ch;
s[0] = '#';
while (!fin.eof()) {
fin.get(ch);
s[N++] = ch;
s[N++] = '#';
}
N -= 3;
fin.close();
int best = 0;
for (int i = 1; i < N; ++i) {
if (best + l[best] >= i) {
l[i] = min(best + l[best] - i, l[2 * best - i]);
}
while (i - l[i] - 1 >= 0 && i + l[i] + 1 <= N &&
s[i - l[i] - 1] == s[i + l[i] + 1]) {
++l[i];
}
if (i + l[i] >= best + l[best]) {
best = i;
}
}
result = 0;
for (int i = 1; i < N; ++i) {
//std::cout << l[i] << ' ' << s[i] << '\n';
if (i % 2 == 0) {
result += (l[i] / 2);
} else {
result += ((l[i] + 1) / 2);
}
}
fout.open("pscpld.out");
fout << result;
fout.close();
return 0;
}