Pagini recente » Cod sursa (job #2781315) | Cod sursa (job #2248658) | Cod sursa (job #2779913) | Cod sursa (job #2669368) | Cod sursa (job #1150778)
#include <fstream>
#include <cstring>
using namespace std;
const int MAX_N = 1000002;
int N;
int dp[2 * MAX_N];
long long sol;
char s[2 * MAX_N], temp[MAX_N];
int main() {
ifstream f("pscpld.in");
ofstream g("pscpld.out");
s[0] = temp[0] = ' ';
f >> (temp + 1);
N = strlen(temp) - 1;
for(int i = 1, j = 1; i <= N; ++i) {
s[j] = '#';
s[++j] = temp[i];
++j;
}
N = 2 * N + 1;
s[N] = '#';
for(int i = 1, best = 0; i <= N; ++i) {
if(i + best >= dp[i])
dp[i] = min(dp[i - 2 * (i - best)], best + dp[best] - i);
dp[i] = max(dp[i], 1);
while(i - dp[i] >= 1 && i + dp[i] <= N && s[i - dp[i]] == s[i + dp[i]])
++dp[i];
--dp[i];
if(i + dp[i] >= best + dp[best])
best = i;
sol += (dp[i] + 1) / 2;
}
g << sol << "\n";
f.close();
g.close();
return 0;
}