传vector写法:
vector <int .> & s ||->这样写在函数里就可以了
vector上做lower_bound二分
int ans=lower_bound(s.begin(),s.end(),k)-s.begin(); 注意ans是地址,取当前的值话要再写一步,如果没有找到,返回的是s.size(),通过这个判断是否找到了(前提是s不为空)
养成return -1 的好习惯。
题意:从第一个序列中找出最少的子序列组成第二个序列,可以重复用。
思路:26个vector记录每个字母的位置,每次在vector上做二分保证复杂度。erfen函数负责查找,check函数负责最开始的判断,
#include<bits/stdc++.h>
using namespace std ;
int sum[30],sum1[30];
int erfen(int q , int k ,vector<int> & s) {
int ans=lower_bound(s.begin(),s.end(),k)-s.begin();
if(ans==s.size()) {
return -1;
} else {
return ans;
}
}
int check(string a,string b) {
memset(sum,0,sizeof(sum));
memset(sum1,0,sizeof(sum1));
for(int i=0; i<a.size(); i++) {
sum[a[i]-'a']++;
}
for(int i=0; i<b.size(); i++) {
sum1[b[i]-'a']++;
}
for(int i=0; i<=26; i++) {
if((sum[i]>=1&&sum1[i]>=1)||(sum[i]>=0&&sum1[i]==0)) {
continue;
} else {
return 0;
}
}
return 1;
}
int main() {
int T;
cin>>T;
while(T--) {
vector<int> s[100];
string a;
cin>>a;
string b;
cin>>b;
if(check(a,b)==0) {
printf("-1\n");
continue;
}
for(int i=0; i<a.size(); i++) {
s[a[i]-'a'].push_back(i+1);
}
int ans=1,k=0;
for(int i=0; i<b.size(); i++) {
int t=erfen(b[i]-'a',k,s[b[i]-'a']);
if(t>=0) {
k=s[b[i]-'a'][t]+1;
} else {
ans++;
k=s[b[i]-'a'][erfen(b[i]-'a',0,s[b[i]-'a'])]+1;
}
}
printf("%d\n",ans);
}
}