Advertisement
Zeinab_Hamdy

Untitled

Oct 6th, 2024
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.88 KB | None | 0 0
  1. //  #### Zeinab
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. #define nl "\n"
  5. #define fi first
  6. #define se second
  7. #define pb push_back
  8. #define ll long long
  9. #define RV return void
  10. #define sz(x) int(x.size())
  11. #define all(v) v.begin(), v.end()
  12. #define rall(v) v.rbegin(), v.rend()
  13. #define cin(v) for(auto&x:v) cin >> x;
  14. #define cout(v) for(auto&x:v) cout << x << " ";
  15.  
  16.  
  17. int n;
  18. string s;
  19. const int N = 1e6 + 5 , MD = 1e9+7;
  20. int p[2]= {31 , 37} , mod[2] = {MD , MD+2};
  21.  
  22. int pref[N][2] , pw[N][2] , inv[N][2];
  23.  
  24.  
  25. int mul(int a , int b , int md){
  26.     return ( ( 1ll * a % md) * ( 1ll*b % md) ) % md;
  27. }
  28. int add(int a , int b , int md){
  29.     return ( (a % md) + ( b % md) ) % md;
  30. }
  31. int fastPower(int a , int b , int md){
  32.     int ret =1;
  33.     while(b){
  34.         if(b & 1 ) ret = mul( ret, a , md);
  35.         a= mul(a , a , md );
  36.         b>>=1;
  37.     }
  38.     return ret ;
  39. }
  40.  
  41. void pre(){
  42.     pw[0][0] = pw[0][1] = inv[0][0] = inv[0][1] =1;
  43.  
  44.    
  45.     for(int j =0 ;j < 2 ; j++){
  46.         int minv = fastPower(p[j] , mod[j]-2 , mod[j]);
  47.         for(int i =1 ; i < N ; i++){
  48.             pw[i][j] = mul(pw[i-1][j], p[j] , mod[j]);
  49.             inv[i][j] = mul(inv[i-1][j] , minv , mod[j]);
  50.         }
  51.     }
  52. }
  53.  
  54. void calc(){
  55.     for(int j =0 ; j < 2 ; j++){
  56.         for(int i =0 ; i < n ; i++){
  57.             int ch = s[i] - 'a' + 1;
  58.             pref[i][j] = mul(ch , pw[i][j] , mod[j]);
  59.             if(i){
  60.                 pref[i][j] = add(pref[i][j] , pref[i-1][j] , mod[j]);
  61.             }
  62.         }
  63.     }
  64. }
  65.  
  66. int reCalc(int l , int r , int step){
  67.     int ret = pref[r][step];
  68.     if(l){
  69.         ret = (ret - pref[l-1][step] + mod[step]) % mod[step];
  70.     }
  71.     ret = mul(ret , inv[l][step] , mod[step]);
  72.     return ret;
  73. }
  74.  
  75. pair < int , int > get_Hash(int l , int r){
  76.     return {reCalc(l,r,0) , reCalc(l,r,1)};
  77. }
  78.  
  79. void solve(){
  80.  
  81.     int k ;
  82.     string t;
  83.     cin >> s >> t;
  84.     n = sz(s) , k = sz(t);
  85.  
  86.     if(k > n) RV(cout <<"Not Found");
  87.  
  88.  
  89.     calc();
  90.  
  91.     int ret2[] ={0,0};
  92.     for(int j =0 ; j < 2 ; j++){
  93.         int val =0;
  94.         for(int i =0 ; i < k ; i++){
  95.             int ch = t[i] - 'a' + 1;
  96.             int curr = mul(ch , pw[i][j] , mod[j]);
  97.             val = add(val ,curr , mod[j]);
  98.         }
  99.         ret2[j] = val;
  100.     }
  101.     vector < int > ans;
  102.     for(int i =0 ; i + k -1 < n ; i++){
  103.         auto ret1 = get_Hash(i,i+k-1) ;
  104.         if(ret1.fi == ret2[0] and ret1.se == ret2[1])
  105.             ans.pb(i+1);
  106.     }
  107.  
  108.     if(ans.empty()) RV(cout <<"Not Found");
  109.    
  110.     cout << sz(ans) << nl;
  111.     for(auto& x : ans) cout << x << " ";
  112.  
  113.    
  114. }
  115.  
  116.  
  117. int main(){
  118.     ios_base::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);  
  119.    
  120.     int t=1;
  121.         cin >> t ;
  122.     pre();
  123.     for(int i=1 ; i <= t ; i++){
  124.         // cout << "Case #"<< i <<": ";
  125.         if(i != 1) cout << nl;
  126.         solve();
  127.             cout << nl;
  128.     }
  129.     return 0;
  130. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement