题解:P10995 【MX-J3-T2】Substring
B. Substring 官方题解
本题考察的主要知识点:
- 【3】递推法(前缀和)
- 【4】lower_bound 函数
思路分析
(为了防止双重下标,可能会用
考虑如何比较
因为数列
否则一个字符串必然是另一个的前缀。如果
使用这个方法可以把所有子串进行排序,根据选用排序方法的不同可得
进一步思考,我们不求出所有子串,照样可以回答“第
假设
在读入整个
对于一个问题,我们查找最小的
总时间复杂度
参考代码
#include<bits/stdc++.h>
using namespace std;
int n,q,x,p[300005];
long long k,c[300005];
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++){
scanf("%d",&x);
p[x]=i;
}
for(int i=1;i<=n;i++)
c[i]=c[i-1]+n-p[i]+1;
for(;q;q--){
scanf("%lld",&k);
int l=lower_bound(c,c+n+1,k)-c;
printf("%d %lld\n",p[l],k-c[l-1]+p[l]-1);
}
return 0;
}