Pagini recente » Cod sursa (job #3270837) | Cod sursa (job #1151459) | Cod sursa (job #485657) | Cod sursa (job #86378) | Cod sursa (job #2631015)
#include <bits/stdc++.h>
using namespace std;
int manacher[2000006];
int main()
{
ifstream fin ("pscpld.in");
ofstream fout ("pscpld.out");
string s, initialS;
fin >> initialS;
s = "&&"; //pun de 2 ori caracterul special pentru ca vreau indexare de la 1.
for (auto x : initialS) {
s += x;
s += "&";
}
int middle = 0;
for (int i = 1; i < s.size(); ++i) {
if (middle + (manacher[middle] - 1) / 2 >= i) {
manacher[i] = min(manacher[middle - (i - middle)], 2 * (middle + (manacher[middle] - 1) / 2 - i) + 1);
while (i + (manacher[i] - 1) / 2 + 1 < s.size() and i - (manacher[i] - 1) / 2 - 1 >= 1 and s[i + (manacher[i] - 1) / 2 + 1] == s[i - (manacher[i] - 1) / 2 - 1]) {
manacher[i] += 2;
}
if (i + (manacher[i] - 1) / 2 >= middle + (manacher[middle] - 1) / 2) {
middle = i;
}
} else {
manacher[i] = 1;
while (i + (manacher[i] - 1) / 2 + 1 < s.size() and i - (manacher[i] - 1) / 2 - 1 >= 1 and s[i + (manacher[i] - 1) / 2 + 1] == s[i - (manacher[i] - 1) / 2 - 1]) {
manacher[i] += 2;
}
middle = i;
}
}
long long answer = 0;
for (int i = 1; i < s.size(); ++i) {
answer += ((manacher[i] - 1) / 2 + 1) / 2;
}
fout << answer;
return 0;
}