YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

妈耶,,,被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;
}

 

posted on 2020-01-30 21:59  Target--fly  阅读(244)  评论(0编辑  收藏  举报