妈耶,,,被B题卡到哭,C题一发就过了。。。
字符串问题。首先用vector记录每个字符出现的位置,然后对字符串t的每个字符,用二分查找函数查找,注意用upper_bound查找,对于字符i,首先用变量pre记录第i-1个字符的位置。然后第i个字符的位置只能比
第i-1个字符位置大,所以用二分查一下,如果查不到,答案+1,然后重新查找一遍。若可以则直接更新一下前驱就行了。
#include<bits/stdc++.h> using namespace std; const int N=200; vector<int >ve[N]; bool mark[N]; void solve() { memset(mark,0,sizeof mark); for(char i='a';i<='z';i++){ int c=i; ve[c].clear(); } string s,t; cin>>s; cin>>t; int a=s.size(); for(int i=0;i<a;i++){ int c=s[i]; ve[c].push_back(i); mark[c]=1; } int pre=-1; int b=t.size(); for(int i=0;i<b;i++){ int c=t[i]; if(!mark[c]) { cout<<-1<<endl; return ; } } int ans=1; for(int i=0;i<b;i++){ int x=t[i]; if (upper_bound(ve[x].begin(),ve[x].end(),pre)==ve[x].end()){ pre=*upper_bound(ve[x].begin(),ve[x].end(),-1); ans++; } else { pre=*upper_bound(ve[x].begin(),ve[x].end(),pre); } } cout<<ans<<endl; return ; } int main() { int t; cin>>t; while(t--) solve(); return 0; }