Pagini recente » Cod sursa (job #1684653) | Cod sursa (job #268430) | Cod sursa (job #985483) | Cod sursa (job #1037609) | Cod sursa (job #2299288)
#include <bits/stdc++.h>
#define NM 1000002
#define ll long long
using namespace std;
string s;
int n;
int lg1[NM], lg2[NM];
int main()
{
cin >> s;
n = s.size();
int pog = -1, p = -1, pt = -1;
ll ans = 0;
for(int i = 0; i < n; i++)
{
lg1[i] = 1;
lg2[i] = 0;
if(i <= pog)
lg1[i] = min(lg1[p - (i - p) + pt], pog - i + 1);
if(i < pog)
lg2[i] = min(lg2[p - (i - p)], pog - i);
while(i - lg1[i] >= 0 && i + lg1[i] < n && s[i - lg1[i]] == s[i + lg1[i]])
lg1[i] += 1;
while(i - lg2[i] >= 0 && i + lg2[i] + 1 < n && s[i - lg2[i]] == s[i + lg2[i] + 1])
lg2[i] += 1;
if(i + lg1[i] - 1 > pog)
{
pog = i + lg1[i] - 1;
p = i;
pt = 0;
}
if(i + lg2[i] > pog)
{
pog = i + lg2[i];
p = i;
pt = 1;
}
ans += lg1[i] + lg2[i];
}
cout << ans << "\n";
return 0;
}