Pagini recente » Cod sursa (job #995468) | Cod sursa (job #566271) | Cod sursa (job #1937771) | Cod sursa (job #693246) | Cod sursa (job #2843369)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("pscpld.in");
ofstream fout("pscpld.out");
const int NMAX = 1e6 + 2;
int z[NMAX];
long long ans;
string a, S;
int mymin(int a, int b)
{
return (a < b ? a : b);
}
int main()
{
fin >> a;
int sz = a.size();
S.push_back('$');
for(int i = 0; i < sz; i++) {
S.push_back(a[i]);
S.push_back('$');
}
S.pop_back();
int L = 0, R = 0;
int n = S.size();
z[1] = 1;
for(int i = 2; i < n; ++i) {
if(i <= R) {
z[i] = mymin(R - i + 1, z[R + L - i]);
}
else z[i] = 1;
while(i - z[i] > 0 && i + z[i] < n + 1 && S[i - z[i]] == S[i + z[i]])
++z[i];
if(i + z[i] - 1 > R) {
R = i + z[i] - 1;
L = i - z[i] + 1;
}
}
for(int i = 1; i < n; i++) {
if(S[i] == '$')
ans += ((z[i] - 1) >> 1);
else ans += ((z[i] + 1) >> 1);
}
fout << ans << '\n';
return 0;
}