Pagini recente » Cod sursa (job #2355330) | Cod sursa (job #2039634) | Cod sursa (job #1037447) | Cod sursa (job #678495) | Cod sursa (job #813218)
Cod sursa(job #813218)
#include<cstdio>
#include<iostream>
#include<fstream>
#include<string>
using std::string;
using std::cin;
using std::cout;
using std::min;
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","r",stdin);
ofstream cout("pscpld.out","w",stdout);
#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;
}