码迷,mamicode.com
首页 > 其他好文 > 详细

Obtain The String CodeForces - 1295C

时间:2020-01-30 22:42:45      阅读:82      评论:0      收藏:0      [点我收藏+]

标签:ORC   oid   nbsp   back   its   二分   turn   bit   直接   

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

 

Obtain The String CodeForces - 1295C

标签:ORC   oid   nbsp   back   its   二分   turn   bit   直接   

原文地址:https://www.cnblogs.com/Accepting/p/12244130.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!