Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <algorithm>
- #include <string>
- using namespace std;
- typedef long long ll;
- const ll MOD(ll(1e9) + 7);
- const ll C(101);
- const int N(300001);
- char buffer[N];
- int vec[N], arr[N];
- ll power[N];
- string str;
- int n;
- inline ll simp(ll a){ return ((a % MOD) + MOD) % MOD; }
- inline ll substring(int l, int r){ return simp(vec[r + 1] - vec[l] * power[r - l]); }
- bool cmp(int a, int b){
- int l = 0;
- int r = n - 1;
- int ans = -1;
- while(l <= r){
- int m = (l + r) >> 1;
- if(substring(a, a + m) == substring(b, b + m)){
- l = m + 1;
- ans = m;
- }else{
- r = m - 1;
- }
- }
- if(ans == n - 1) return a < b;
- return str[a + ans + 1] < str[b + ans + 1];
- }
- int main(){
- scanf("%d", &n);
- scanf("%s", buffer);
- str += buffer;
- str += buffer;
- for(int i = 1; i <= (int)str.size(); ++i){
- vec[i] = (vec[i - 1] * C) % MOD;
- vec[i] += str[i - 1];
- vec[i] %= MOD;
- }
- power[0] = 1;
- for(int i = 1; i <= n; ++i) power[i] = (power[i - 1] * C) % MOD;
- for(int i = 0; i < n; ++i) arr[i] = i;
- sort(arr, arr + n, cmp);
- int q;
- scanf("%d", &q);
- while(q--){
- int a;
- scanf("%d", &a);
- printf("%d\n", arr[a - 1]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment