解题思路:起初想到最暴力的方法对于每一个ti都遍历一遍字符串n,复杂度为O(nm),显然超时,考虑前缀和记录26种字母在字符串各处的数量,然后枚举每一个字母,运用二分查找,记录最大值,最大值即为所需最少购买数,复杂度为O(logn*m)。
#include <bits/stdc++.h>//双倍经验
using namespace std;
typedef long long int ll;
ll n,m;
int k[200500][30];//各个字母的数量
int i[30];//需要的字母数量
string s,t;
int main(){
cin>>n>>s>>m;
for(ll x=1;x<=n;x++){
char op=s[x-1];
for(ll y=1;y<=26;y++){
if(op-'a'+1==y){
k[x][y]=k[x-1][y]+1;
}else{
k[x][y]=k[x-1][y];
}
}
}
while(m--){
cin>>t;
memset(i,0,sizeof(i));
int len=t.size();
for(int x=0;x<len;x++){
i[t[x]-'a'+1]++;
}
int ans=0;
for(int x=1;x<=26;x++){
if(!i[x]){
continue;
}
int l,r;
l=ans,r=n;
while(l<=r){
if(l==r){
ans=l;
break;
}
int m=(r+l)/2;
if(k[m][x]>=i[x]){
r=m;
continue;
}else{
l=m+1;
}
}
}
cout<<ans<<endl;
}
return 0;
}