Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdio>
- #include <algorithm>
- #include <vector>
- #include <cstring>
- using namespace std;
- typedef long long ll;
- #define pb push_back
- const int N = 2e5 + 5;
- vector <int> beg[N];
- int n, z[N];
- char tt[N];
- string s;
- void read() {scanf("%s", tt);}
- ll solve100()
- {
- n = strlen(tt);
- s = " ";
- for (int i = 0; i < n; ++i)
- {
- s += tt[i];
- s += " ";
- }
- int leng = s.size();
- for (int i = 0, l = 0, r = -1; i < leng; ++i)
- {
- int tmp;
- if (i <= r) tmp = min(r - i + 1, z[r - i + l]);
- else tmp = 0;
- while (i - tmp >= 0 && i + tmp < leng && s[i - tmp] == s[i + tmp]) ++tmp;
- z[i] = tmp;
- if (i + tmp - 1 > r)
- {
- l = i - tmp + 1;
- r = i + tmp - 1;
- }
- }
- ll ret = 0;
- for (int i = 1; i + 1 < leng; ++i)
- {
- int len = z[i] - 1, bg = (i - 1) / 2;
- if (i % 2)
- {
- ret += len / 2;
- beg[bg - len / 2].pb(bg + len / 2);
- } else
- {
- if (z[i] == 1) continue;
- ret += len / 2 - 1;
- beg[bg - len / 2 + 1].pb(bg + len / 2);
- }
- }
- int mxend = -1;
- for (int i = 0; i < n; ++i)
- {
- reverse(beg[i].begin(), beg[i].end());
- for (int j = 0; j < beg[i].size(); ++j)
- {
- if (mxend >= beg[i][j]) ++ret;
- mxend = max(mxend, beg[i][j]);
- }
- }
- return ret;
- }
- int main()
- {
- freopen("tesseract.in", "r", stdin);
- freopen("tesseract.out", "w", stdout);
- read();
- cout << solve100() << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement