二分+前缀和可以很好的降低时间复杂度,很好的题目
还有就是要熟悉这种只有小写字母的情况下的 二位前缀和 存储 前缀中字母的个数的方法
#include<string>
#include<cstring>
#include<iostream>
using namespace std;
int t,length,ans,cnt1[200000+100][30],cnt2[30];
string str,T;
bool check(int L) { //购买长度为L的原序列的前缀能不能满足要求
for(int i=0; i<T.length(); i++) {
if(cnt1[L-1][T[i]-'a']<cnt2[T[i]-'a']) return false;
}
return true;
}
int main() {
cin>>length>>str>>t;
for(int i=0; i<length; i++) {
cnt1[i][str[i]-'a']++;//cnt[i][j]表示截止到第i位时 字母j+‘a'出现的次数
if(i!=0)
for(int j=0; j<26; j++) {
cnt1[i][j]+=cnt1[i-1][j];
}
}
while(t--) {
memset(cnt2,0,sizeof(cnt2));
ans=0;
cin>>T;
for(int i=0; i<T.length(); i++) {
cnt2[T[i]-'a']++;
}
int l=0,r=length,mid;
while(l<=r) {
mid=(l+r)/2;
if(check(mid)) {
r=mid-1;
ans=mid;
} else {
l=mid+1;
}
}
cout<<ans<<endl;
}
return 0;
}