Advertisement
Korotkodul

ХЭШИ D

Sep 17th, 2022 (edited)
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.59 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. #define vec vector
  12. using namespace std;
  13. using ll = long long;
  14. using ld = long double;
  15. using db = double;
  16. void cv(vector <int> &v){
  17.     for (auto x: v) cout<<x<<' ';
  18.     cout<<"\n";
  19. }
  20.  
  21. void cvl(vector <ll> &v){
  22.     for (auto x: v) cout<<x<<' ';
  23.     cout<<"\n";
  24. }
  25.  
  26.  
  27. void cvv(vector <vector <int> > &v){
  28.     for (auto x: v) cv(x);
  29.     cout<<"\n";
  30. }
  31.  
  32. void cvb(vector <bool> v){
  33.     for (bool x: v) cout<<x<<' ';
  34.     cout<<"\n";
  35. }
  36.  
  37. void cvs(vector <string>  v){
  38.     for (auto a: v){
  39.         cout<<a<<"\n";
  40.     }
  41. }
  42.  
  43. void cvp(vector <pii> a){
  44.     for (auto p: a){
  45.         cout<<p.first<<' '<<p.second<<"\n";
  46.     }
  47.     cout<<"\n";
  48. }
  49.  
  50. ll mod=1e9+7, p  =101;
  51. bool sh=0;
  52.  
  53. int main()
  54. {
  55.     ios::sync_with_stdio(0);
  56.     cin.tie(0);
  57.     cout.tie(0);
  58.     string s; cin>>s;  int n = s.size();
  59.     vector <ll> pf(n), powp(n,1);
  60.     for (int i = 1; i < n; ++i) {
  61.         powp[i] = powp[i - 1] * p % mod;
  62.     }
  63.     pf[0] = s[0] - 'a' + 1;
  64.     for (int i = 1; i < n; ++i){
  65.         pf[i] = pf[i - 1] + (s[i] - 'a' + 1) * powp[i];
  66.         pf[i] %= mod;
  67.     }
  68.     if (sh){
  69.         cout<<"s\n";
  70.         cout<<s<<"\n";
  71.         cout<<"pf\n";
  72.         cvl(pf);
  73.     }
  74.     vector <int> ans;
  75.  
  76.     //отдельно проверить a = 0
  77.     int b=0;
  78.  
  79.     for (int a = 1; a <= n; ++a){
  80.         //if ((n - a - b) % (a + b) != 0) continue;
  81.         //[0;a-1] - suf, [n-b-1; n - 1] - pref
  82.         ll A,B;
  83.         bool ok = 1;
  84.         if (sh){
  85.             cout<<"a b = "<<a<<' '<<b<<"\n";
  86.         }
  87.         int id;
  88.         for (int i = a; i + (a + b)  - 1 < n - b; i += a + b){//+-1 после i + (a + b)  ТАК СИЛЬНО ВСЕ МЕНЯЕТ -- ПОЧЕМУ???
  89.             id = i;
  90.             if (sh){
  91.                 cout<<"l r = "<<i<<' '<<i + a + b - 1<<"\n";
  92.             }
  93.             A = pf[a - 1] * powp[i] % mod;
  94.             B = (pf[i + a - 1] - pf[i - 1] + mod) % mod;
  95.             if (A != B){
  96.                 ok=0;
  97.                 break;
  98.             }
  99.         }
  100.         B = (pf[n - 1] - pf[id - 1] + mod) % mod;
  101.         A = pf[n - id - 1] * powp[id] % mod;
  102.         if (A != B){
  103.             ok = 0;
  104.         }
  105.         if (ok){
  106.             //cout<<"OK\n";
  107.             //cout<<"a b = "<<a<<' '<<b<<"\n";
  108.             ans.push_back(a+b);
  109.         }
  110.  
  111.  
  112.     }
  113.  
  114.  
  115.     for (int a = 1; a <= n; ++a){
  116.         for (int b = 1; b <= n - a; ++b){
  117.             //if ((n - a - b) % (a + b) != 0) continue;
  118.             //[0;a-1] - suf, [n-b-1; n - 1] - pref
  119.             bool ok = 1;
  120.             if (sh){
  121.                 cout<<"a b = "<<a<<' '<<b<<"\n";
  122.             }
  123.             for (int i = a; i + (a + b)  - 1 < n - b; i += a + b){//+-1 после i + (a + b)  ТАК СИЛЬНО ВСЕ МЕНЯЕТ -- ПОЧЕМУ???
  124.                 if (sh){
  125.                     cout<<"l r = "<<i<<' '<<i + a + b - 1<<"\n";
  126.                 }
  127.                 ll A = (pf[a - 1] * powp[n - b] % mod + (pf[n - 1] - pf[n - b - 1] + mod) % mod) % mod;
  128.                 ll B = (pf[i + a + b - 1] - pf[i - 1] + mod) * powp[n - (i + a + b - 1)] % mod;
  129.                 if (A != B){
  130.                     ok=0;
  131.                     break;
  132.                 }
  133.             }
  134.             if (ok){
  135.                 //cout<<"OK\n";
  136.                 //cout<<"a b = "<<a<<' '<<b<<"\n";
  137.                 ans.push_back(a+b);
  138.             }
  139.         }
  140.     }
  141.     sort(ans.begin(), ans.end());
  142.     if (sh){
  143.         cout<<"ans\n";
  144.         cv(ans);
  145.     }
  146.     cout<<ans[0];
  147. }
  148. /*
  149. abaabaabaa
  150. */
  151.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement