Advertisement
sidjha57

ps

Dec 13th, 2021
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. #define ll long long int
  2. #define loop(i,a,b) for(int i=(a);i<=(b);i++)
  3. #define vi vector<ll>
  4. #define mod 1000000007
  5.  
  6. class Solution {
  7. public:
  8.  
  9. vi pre,suf;
  10. ll binpow(ll a, ll b, ll m) {
  11. a %= m;
  12. ll res = 1;
  13. while (b > 0) {
  14. if (b & 1)
  15. res = res * a % m;
  16. a = a * a % m;
  17. b >>= 1;
  18. }
  19. return res;
  20. }
  21. bool check (ll i,ll j, ll len, ll n) {
  22. ll left,right,pow_31=1;
  23. if (i-len+1 >= 0 && j+len <= n) {
  24. if (i-len+1 == 0) left = pre[i];
  25. else {
  26. left = pre[i] - pre[i-len];
  27. pow_31 = binpow(31,i-len+1,mod);
  28. left = left*binpow(pow_31,mod-2,mod);
  29. left %= mod;
  30. }
  31. if (j+len == n) right = suf[j];
  32. else {
  33. right = suf[j] - suf[j+len];
  34. pow_31 = binpow(31,(n-j-len),mod);
  35. right = right*binpow(pow_31,mod-2,mod);
  36. right %= mod;
  37. }
  38. if (left == right)
  39. return true;
  40. }
  41. return false;
  42. }
  43.  
  44. int countSubstrings(string s) {
  45. ll n = s.size(),pow_31=31,ans=0;
  46. pre.assign(n,0), suf.assign(n,0);
  47. pre[0] = s[0] - 'a'+1;
  48. suf[n-1] = s[n-1] - 'a'+1;
  49. loop (i,1,n-1) {
  50. pre[i] = pow_31*(s[i] - 'a' + 1) + pre[i-1];
  51. pre[i] %= mod;
  52. suf[n-i-1] = pow_31*(s[n-i-1] - 'a' + 1) + suf[n-i];
  53. suf[n-i-1] %= mod;
  54. pow_31 = pow_31*31;
  55. pow_31 %= mod;
  56. }
  57. loop (i,0,n-1) {
  58. ll l = 0,r=n,a=0;
  59. while (r >= l) {
  60. ll mid = l + (r-l)/2;
  61. if (check(i-1,i+1,mid,n))
  62. a=mid,l = mid+1;
  63. else
  64. r = mid-1;
  65. }
  66. ans += (a+1);
  67. //cout << l << " ";
  68. }
  69. //cout << ans << " ";
  70.  
  71. loop (i,0,n-1) {
  72. ll l = 0,r=n,a=0;
  73. while (r > l+1) {
  74. ll mid = l + (r-l)/2;
  75. if (check(i-1,i,mid,n))
  76. a=mid, l = mid+1;
  77. else
  78. r = mid-1;
  79. }
  80. ans += a;
  81. }
  82. //cout << ans << " ";
  83. return ans;
  84. }
  85.  
  86. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement