nullzero

luvlubb tumso10

Oct 22nd, 2012
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.33 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <string>
  4.  
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. const ll MOD(ll(1e9) + 7);
  10. const ll C(101);
  11. const int N(300001);
  12.  
  13. char buffer[N];
  14. int vec[N], arr[N];
  15. ll power[N];
  16. string str;
  17. int n;
  18.    
  19. inline ll simp(ll a){ return ((a % MOD) + MOD) % MOD; }
  20. inline ll substring(int l, int r){ return simp(vec[r + 1] - vec[l] * power[r - l]); }
  21.  
  22. bool cmp(int a, int b){
  23.     int l = 0;
  24.     int r = n - 1;
  25.     int ans = -1;
  26.     while(l <= r){
  27.         int m = (l + r) >> 1;
  28.         if(substring(a, a + m) == substring(b, b + m)){
  29.             l = m + 1;
  30.             ans = m;
  31.         }else{
  32.             r = m - 1;
  33.         }
  34.     }
  35.     if(ans == n - 1) return a < b;
  36.     return str[a + ans + 1] < str[b + ans + 1];
  37. }
  38.  
  39. int main(){
  40.     scanf("%d", &n);
  41.     scanf("%s", buffer);
  42.     str += buffer;
  43.     str += buffer;
  44.     for(int i = 1; i <= (int)str.size(); ++i){
  45.         vec[i] = (vec[i - 1] * C) % MOD;
  46.         vec[i] += str[i - 1];
  47.         vec[i] %= MOD;
  48.     }
  49.     power[0] = 1;
  50.     for(int i = 1; i <= n; ++i) power[i] = (power[i - 1] * C) % MOD;
  51.     for(int i = 0; i < n; ++i) arr[i] = i;
  52.     sort(arr, arr + n, cmp);
  53.     int q;
  54.     scanf("%d", &q);
  55.     while(q--){
  56.         int a;
  57.         scanf("%d", &a);
  58.         printf("%d\n", arr[a - 1]);
  59.     }
  60.     return 0;
  61. }
Advertisement
Add Comment
Please, Sign In to add comment