Pagini recente » Cod sursa (job #80094) | Cod sursa (job #2390880) | Cod sursa (job #1379153) | Cod sursa (job #2858025) | Cod sursa (job #2747547)
#include <iostream>
#include <fstream>
#include <string>
int dp[2000100];
std::string b;
std::string a;
int main() {
std::ifstream in("pscpld.in");
std::ofstream out("pscpld.out");
in >> b;
a.resize(2 * b.size() + 1);
a[0] = '$';
int idx = 0;
for (char i : b) {
a[++idx] = i;
a[++idx] = '$';
}
int curr = 0;
int best_right = 0;
int64_t ans = 0;
dp[0] = 1;
for(int i = 1; i < a.size(); ++i) {
int len = 1;
if(i <= best_right)
len = std::min(dp[2 * curr - i], best_right - i + 1);
while(i - len >= 0 && i + len < a.size() && a[i + len] == a[i - len]) ++len;
if(i + len - 1 > best_right)
best_right = i + len - 1, curr = i;
dp[i] = len;
ans += dp[i] / 2;
}
out << ans << '\n';
return 0;
}