Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define pb push_back
- typedef long long ll;
- typedef long double dl;
- const int N = 1e6;
- typedef __int128 lll;
- ll f[N];
- ll s[N];
- ll step[N];
- int p = 29;
- ll mod = 1e9+21;
- ll h(ll l, ll r){
- --l;
- ll h2 = (((f[r] - f[l] * step[r-l]) % mod) + mod) % mod;
- return h2;
- }
- ll g_h2(ll l , ll r){
- --l;
- ll h2 = (((s[r] - s[l] * step[r-l]) % mod) + mod) % mod;
- return h2;
- }
- int main() {
- #ifdef anime
- freopen("input1.txt", "r", stdin);
- freopen("outpu1.txt", "w", stdout);
- #endif
- string s1;
- cin >> s1;
- s1 = '#' + s1 + '*';
- step[0] = 1;
- for(int i = 1; i < s1.size(); ++i){
- step[i] = (step[i-1]*p)%mod;
- }
- for(int i = 1; i < s1.size(); ++i){
- f[i] = ((s1[i] - 'a' + 1) +f[i-1]*p) % mod;
- }
- reverse(s1.begin(), s1.end());
- string s2 = s1;
- for(int i = 1; i < s2.size(); ++i){
- s[i] = ((s2[i] - 'a' + 1) + s[i-1]*p) % mod;
- }
- ll count = 0;
- for(int i = 1; i < s1.size(); ++i){
- ll l = 0;
- ll q = s1.size()-i;
- ll r = 0;
- if(q>i) r = i;
- else r = q;
- while(r-l>1){
- ll mid = (l+r)/2;
- if(h(i, i+mid) == g_h2(s1.size()-i-1, s1.size()-i-1+mid)) l = mid;
- else r = mid;
- }
- count+=l;
- }
- for(int i = 1; i < s1.size()-1; ++i){
- ll l = 0;
- ll q = s1.size()-i;
- ll r = 0;
- if(q>i) r = i+1;
- else r = q;
- while(r-l>1){
- ll mid = (l+r)/2;
- if(h(i+1, i+mid) == g_h2(s1.size()-i-1, s1.size()-i-2+mid)) l=mid;
- else r = mid;
- }
- count+=l;
- }
- cout << count;
- }
- // abaccab
- // // (s.size()-i+1)+mid;
- // abacadba
- // abdacaba
- // abacad
- // dacaba
- // m=2
- // i =4
- // abadac
- // cadaba
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement