Pagini recente » Cod sursa (job #1371549) | Borderou de evaluare (job #1268045) | Cod sursa (job #2389667) | Cod sursa (job #2617235) | Cod sursa (job #2747530)
#include <iostream>
#include <fstream>
#include <string>
int dp[2000100];
std::string a = "$";
int main() {
std::ifstream in("pscpld.in");
std::ofstream out("pscpld.out");
char ch;
while(in >> ch) {
a += ch;
a += "$";
}
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;
}