Pagini recente » Cod sursa (job #925974) | Cod sursa (job #3286803) | Cod sursa (job #836312) | Cod sursa (job #3259792) | Cod sursa (job #3288574)
#include <bits/stdc++.h>
using namespace std;
string s;
string t;
int main() {
freopen("pscpld.in", "r", stdin);
freopen("pscpld.out", "w", stdout);
cin.tie(0); cout.tie(0);
ios_base::sync_with_stdio(false);
cin >> s;
t += "$";
for(auto i : s) {
t += "#";
t += i;
}
t += "#";
t += "^";
auto manacher = [](string t) {
long long ans = 0;
int le = 1, ri = 1; //am o secventa palindromica (le + 1 ... ri - 1)
vector<int>sz(t.size() + 1, 0);
//sz[i] -> cate secvente palindromice au mijlocul in i
for(int i = 1; i < t.size() - 1; i++) {
sz[i] = max(0, min(sz[le + (ri - i)], ri - i));
while(t[i - sz[i]] == t[i + sz[i]]) { sz[i]++; }
if(i + sz[i] > ri) {
le = i - sz[i];
ri = i + sz[i];
}
ans += (sz[i]) / 2;
}
cout << ans;
};
manacher(t);
}