Advertisement
Korotkodul

ХЭШИ D 2

Sep 17th, 2022
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.69 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 ){//+-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.     int a = 0;
  115.     for (int b = 1; b <= n; ++b){
  116.         //if ((n - a - b) % (a + b) != 0) continue;
  117.         //[0;a-1] - suf, [n-b-1; n - 1] - pref
  118.         ll A,B;
  119.         bool ok = 1;
  120.         if (sh){
  121.             cout<<"a b = "<<a<<' '<<b<<"\n";
  122.         }
  123.         int id;
  124.         for (int i = n - b; i - b >= 0; i -= b){//+-1 после i + (a + b)  ТАК СИЛЬНО ВСЕ МЕНЯЕТ -- ПОЧЕМУ???
  125.             id = i;
  126.             if (sh){
  127.                 cout<<"l r = "<<i<<' '<<i + a + b - 1<<"\n";
  128.             }
  129.             //A - база с конца
  130.             A = (pf[n - 1] - pf[n - b - 1] + mod) % mod;
  131.             B = (pf[i + b - 1] - pf[i - 1] + mod) % mod * powp[n - b] % mod;
  132.             if (A != B){
  133.                 ok=0;
  134.                 break;
  135.             }
  136.         }
  137.         B = pf[id - 1] * powp[n - b] % mod;
  138.         A = (pf[n -  b + id - 1] - pf[n - b - 1] + mod) % mod;
  139.         if (A != B){
  140.             ok = 0;
  141.         }
  142.         if (ok){
  143.             //cout<<"OK\n";
  144.             //cout<<"a b = "<<a<<' '<<b<<"\n";
  145.             ans.push_back(a+b);
  146.         }
  147.  
  148.  
  149.     }
  150.  
  151.  
  152.     for (int a = 1; a <= n; ++a){
  153.         for (int b = 1; b <= n - a; ++b){
  154.             //if ((n - a - b) % (a + b) != 0) continue;
  155.             //[0;a-1] - suf, [n-b-1; n - 1] - pref
  156.             bool ok = 1;
  157.             if (sh){
  158.                 cout<<"a b = "<<a<<' '<<b<<"\n";
  159.             }
  160.             for (int i = a; i + (a + b)  - 1 < n - b; i += a + b){//+-1 после i + (a + b)  ТАК СИЛЬНО ВСЕ МЕНЯЕТ -- ПОЧЕМУ???
  161.                 if (sh){
  162.                     cout<<"l r = "<<i<<' '<<i + a + b - 1<<"\n";
  163.                 }
  164.                 ll A = (pf[a - 1] * powp[n - b] % mod + (pf[n - 1] - pf[n - b - 1] + mod) % mod) % mod;
  165.                 ll B = (pf[i + a + b - 1] - pf[i - 1] + mod) * powp[n - (i + a + b - 1)] % mod;
  166.                 if (A != B){
  167.                     ok=0;
  168.                     break;
  169.                 }
  170.             }
  171.             if (ok){
  172.                 //cout<<"OK\n";
  173.                 //cout<<"a b = "<<a<<' '<<b<<"\n";
  174.                 ans.push_back(a+b);
  175.             }
  176.         }
  177.     }
  178.     sort(ans.begin(), ans.end());
  179.     if (sh){
  180.         cout<<"ans\n";
  181.         cv(ans);
  182.     }
  183.     cout<<ans[0];
  184. }
  185. /*
  186. abaabaabaa
  187. */
  188.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement