Pagini recente » Cod sursa (job #2565553) | Cod sursa (job #176013) | Cod sursa (job #796678) | Cod sursa (job #1326967) | Cod sursa (job #813219)
Cod sursa(job #813219)
#include<cstdio>
#include<iostream>
#include<fstream>
#include<string>
using std::string;
using std::cin;
using std::cout;
using std::min;
using std::ifstream;
using std::ofstream;
const int maxn = 2 * 1000 * 1000 + 5;
int i, j, n, centerBound, rightBound, left, right, Ans[2 * maxn + 5];
long long final_ans;
string Sir;
int main() {
#ifdef INFOARENA
ifstream cin("pscpld.in");
ofstream cout("pscpld.out");
#endif
cin >> Sir;
int n = Sir.size();
string NewSir(2 * n + 1,' ');
for(i = 0; i < n; ++i) {
NewSir[2 * i] = Sir[i];
NewSir[2 * i + 1] = '*';
}
for(i = 0; i <= 2 * n - 1; ++i) {
if(i <= rightBound) {
j = centerBound - (i - centerBound);
Ans[i] = min(Ans[j], rightBound - i + 1);
left = i - Ans[i];
right = i + Ans[i];
}
else {
left = i;
right = i;
}
for(; left >= 0 && right <= 2 * n - 1 && NewSir[left] == NewSir[right]; left--, right++)
Ans[i]++;
--right;
++left;
if(right > rightBound) {
rightBound = right;
centerBound = i;
}
//cout << Ans[i] << " ";
if(i & 1)
final_ans += Ans[i] / 2;
else
final_ans += Ans[i] / 2 + Ans[i] % 2;
}
cout << final_ans << "\n";
return 0;
}