Advertisement
sidjha57

Palindromic substring

Dec 13th, 2021
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.49 KB | None | 0 0
  1. //https://leetcode.com/problems/palindromic-substrings/
  2.  
  3. #include<bits/stdc++.h>
  4. //#include<ext/pb_ds/assoc_container.hpp>
  5. //#include<ext/pb_ds/tree_policy.hpp>
  6. //#include <ext/pb_ds/trie_policy.hpp>
  7. //using namespace __gnu_pbds;
  8. using namespace std;
  9. //typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> pbds;
  10. //typedef trie<string,null_type,trie_string_access_traits<>,pat_trie_tag,trie_prefix_search_node_update> pbtrie;
  11.  
  12. #define ll                       long long int
  13. #define ld                       long double
  14. #define mod                      1000000007
  15. #define inf                      1e18
  16. #define endl                     "\n"
  17. #define pb                       push_back
  18. #define vi                       vector<ll>
  19. #define vs                       vector<string>
  20. #define pii                      pair<ll,ll>
  21. #define ump                      unordered_map
  22. #define mp                       make_pair
  23. #define pq_max                   priority_queue<ll>
  24. #define pq_min                   priority_queue<ll,vi,greater<ll> >
  25. #define all(n)                   n.begin(),n.end()
  26. #define ff                       first
  27. #define ss                       second
  28. #define mid(l,r)                 (l+(r-l)/2)
  29. #define bitc(n)                  __builtin_popcount(n)
  30. #define SET(a)                   memset( a, -1, sizeof a )
  31. #define CLR(a)                   memset( a,  0, sizeof a )
  32. #define Pi                       3.141592653589793
  33. #define loop(i,a,b)              for(int i=(a);i<=(b);i++)
  34. #define looprev(i,a,b)           for(int i=(a);i>=(b);i--)
  35. #define _fast                    ios_base::sync_with_stdio(0);  cin.tie(0);
  36. #define iter(container,it)       for(__typeof(container.begin()) it = container.begin(); it != container.end(); it++)
  37. #define log(args...)             {string _s = #args; replace(_s.begin(), _s.end(), ',', ' '); stringstream _ss(_s); istream_iterator<string> _it(_ss); err(_it, args); }
  38. #define logarr(arr,a,b)          for(int z=(a);z<=(b);z++) cout<<(arr[z])<<" ";cout<<endl;
  39. template <typename T> T          gcd(T a, T b){if(a%b) return gcd(b,a%b);return b;}
  40. template <typename T> T          lcm(T a, T b){return (a*(b/gcd(a,b)));}
  41. vs tokenizer(string str,char ch) {std::istringstream var((str)); vs v; string t; while(getline((var), t, (ch))) {v.pb(t);} return v;}
  42.  
  43. void err(istream_iterator<string> it) {}
  44. template<typename T, typename... Args>
  45. void err(istream_iterator<string> it, T a, Args... args) {
  46. cout << *it << " = " << a << endl;
  47. err(++it, args...);
  48. }
  49.  
  50. vi pre,suf;
  51. ll binpow(ll a, ll b, ll m) {
  52.     a %= m;
  53.     ll res = 1;
  54.     while (b > 0) {
  55.         if (b & 1)
  56.             res = res * a % m;
  57.         a = a * a % m;
  58.         b >>= 1;
  59.     }
  60.     return res;
  61. }
  62. bool check (ll i,ll j, ll len, ll n) {
  63.     ll left,right,pow_31=1;
  64.     if (i-len+1 >= 0 && j+len <= n) {
  65.         if (i-len+1 == 0) left = pre[i];
  66.         else {
  67.             left = pre[i] - pre[i-len];
  68.             pow_31 = binpow(31,i-len+1,mod);
  69.             left = left*binpow(pow_31,mod-2,mod);
  70.             left %= mod;
  71.         }
  72.         if (j+len == n) right = suf[j];
  73.         else {
  74.             right = suf[j] - suf[j+len];
  75.             pow_31 = binpow(31,(n-j-1),mod);
  76.             right = right*binpow(pow_31,mod-2,mod);
  77.             right %= mod;
  78.         }
  79.         if (left == right)
  80.             return true;
  81.     }
  82.     return false;
  83. }
  84.  
  85. int countSubstrings(string s) {
  86.     ll n = s.size(),pow_31=31,ans=0;
  87.     pre.assign(n,0), suf.assign(n,0);
  88.     pre[0] = s[0] - 'a'+1;
  89.     suf[n-1] = s[n-1] - 'a'+1;
  90.     loop (i,1,n-1) {
  91.         pre[i] = pow_31*(s[i] - 'a' + 1) + pre[i-1];
  92.         pre[i] %= mod;
  93.         suf[n-i-1] = pow_31*(s[n-i-1] - 'a' + 1) + suf[n-i];
  94.         suf[n-i-1] %= mod;
  95.         pow_31 = pow_31*31;
  96.         pow_31 %= mod;
  97.     }
  98.     loop (i,0,n-1) {
  99.         ll l = 0,r=n;
  100.         while (r > l+1) {
  101.             ll mid = l + (r-l)/2;
  102.             if (mid == 1 || check(i-1,i+1,mid,n))
  103.                 l = mid;
  104.             else
  105.                 r = mid;
  106.         }
  107.         ans += (2*l+2)/2;
  108.     }
  109.     loop (i,0,n-1) {
  110.         ll l = 0,r=n;
  111.         while (r > l+1) {
  112.             ll mid = l + (r-l)/2;
  113.             if (check(i-1,i,mid,n))
  114.                 l = mid;
  115.             else
  116.                 r = mid;
  117.         }
  118.         ans += (2*l+1)/2;
  119.     }
  120.    
  121.     return ans;
  122. }
  123.  
  124.  
  125. int main(int argc, char const *argv[]){
  126.     _fast
  127.     ll t=1;
  128.     while(t--){
  129.      string s; cin >> s;
  130.      cout << countSubstrings(s);
  131.     }
  132.   return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement