
题意:给出一个字符串s, 可以从左往右拿走s的字符, 至少要到s的第几个位置才能拼成t
思路:用二维数组记录前缀,然后二分即可.
1 #include<bits/stdc++.h>
2
3 using namespace std;
4 #define inf 5000000
5 #define N 210050
6 int sum[N][30];
7 int arr[30];
8 string s;
9 string str;
10 int n;
11 bool slove(int id) {
12 for(int i=0; i<26; i++)
13 if(arr[i]-sum[id][i]>0)
14 return false;
15 return true;
16 }
17 int main() {
18 cin>>n;
19 cin>>str;
20 int _;
21 cin>>_;
22 for(int i=0; i<str.size(); i++) {
23 ++sum[i][str[i]-'a'];
24 if(i!=0) {
25 for(int j=0; j<26; j++) {
26 sum[i][j]+=sum[i-1][j];
27 }
28 }
29 }
30 while(_--) {
31 cin>>s;
32 for(int i=0; i<=26; i++)
33 arr[i]=0;
34 for(int i=0; i<s.size(); i++) {
35 arr[s[i]-'a']++;
36 }
37 int l=0;
38 int r=n;
39 int ans=inf;
40 while(l<=r) {
41 int mid=(l+r)/2;
42 if(slove(mid)) {
43 r=mid-1;
44 ans=min(ans,mid);
45 } else {
46 l=mid+1;
47 }
48 }
49 cout<<ans+1<<'\n';
50 }
51 return 0;
52 }