题目大意:

给定两个字符串s和t,你有一个空字符串z

每次可以取s的任意一个子序列加到z后面

问至少要取多少次才能让z等价于t

解题思路:

vector存s中26个字母的位置

然后t字符串从前往后一个个查找

用变量p记录查到上一个字符时在字符串s中的位置(初始化为-1)

如果在t内碰到一个字符,没有在s中出现过,输出-1结束当次程序

否则,看当前的p是否大于等于这个字符在s中出现的最后一个位置

如果是,说明这一次子序列已经不能往后面取了,说明得另起一次从头取子序列

ans++,让p等于当前字符在s中出现的第一个位置

如果不是二分找大于p的第一个这个字符的位置,让p等于这个位置即可

注意,ans初始化为1,vector要清空……

思路用到了一点点贪心,就是每次都是取上一次的位置后出现的第一个指定字符的位置

#include<bits/stdc++.h>
using namespace std;
string s,t;
vector<int> v[];
int siz[];
inline int gid(char s){
return s-'a';
}
void solve(){
cin>>s>>t;
memset(siz,,sizeof siz);
int lens=s.size(),lent=t.size(),i,j,d,p=-,pd,ans=;
for(i=;i<;i++)
v[i].clear();
for(i=;i<lens;i++){
d=gid(s[i]);
v[d].emplace_back(i);
siz[d]++;
}
for(i=;i<lent;i++){
d=gid(t[i]);
if(siz[d]==){//这个字符没有出现过
cout<<"-1\n";
return;
}
if(p>=v[d][siz[d]-]){//如果已经没法在剩下的位置中取这个字符了,得另起一次从头开始取子序列
ans++;
p=v[d][];
}
else{//否则,二分找大于p的第一个这个字符的位置
pd=upper_bound(v[d].begin(),v[d].end(),p)-v[d].begin();
p=v[d][pd];
}
}
cout<<ans<<'\n';
}
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
int T;cin>>T;while(T--)
solve(); return ;
}

Codeforces 1295C - Obtain The String的更多相关文章

  1. Codeforces #541 (Div2) - E. String Multiplication(动态规划)

    Problem   Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...

  2. Obtain The String CodeForces - 1295C binary_search+思维

    妈耶,,,被B题卡到哭,C题一发就过了... 字符串问题.首先用vector记录每个字符出现的位置,然后对字符串t的每个字符,用二分查找函数查找,注意用upper_bound查找,对于字符i,首先用变 ...

  3. Educational Codeforces Round 81 (Rated for Div. 2) C. Obtain The String

    题目链接:http://codeforces.com/contest/1295/problem/C 题目:给定字符串s,t.  给定一个空串z,需要按照规则把z构造成 string z == stri ...

  4. 【动态规划】【最短路】Codeforces 710E Generate a String

    题目链接: http://codeforces.com/problemset/problem/710/E 题目大意: 问写N个字符的最小花费,写一个字符或者删除一个字符花费A,将当前的字符数量翻倍花费 ...

  5. codeforces 632C The Smallest String Concatenation

    The Smallest String Concatenation 题目链接:http://codeforces.com/problemset/problem/632/C ——每天在线,欢迎留言谈论. ...

  6. 【Codeforces 1120C】Compress String

    Codeforces 1120 C 题意:给一个串\(S\),将这个串分成\(t_1..t_m\),如果\(t_i\)在\(t_1..t_{i-1}\)中作为子串出现过,那么这个的代价是\(b\),否 ...

  7. CodeForces - 1009B Minimum Ternary String

    You are given a ternary string (it is a string which consists only of characters '0', '1' and '2'). ...

  8. 【codeforces 797C】Minimal string

    [题目链接]:http://codeforces.com/contest/797/problem/C [题意] 一开始,给你一个字符串s:两个空字符串t和u; 你有两种合法操作; 1.将s的开头字符加 ...

  9. Codeforces 1144 E. Median String

    原题链接:https://codeforces.com/problemset/problem/1144/E tag:字符串模拟,大整数. 题意:给定两个字符串,求字典序中间串. 思路:可以把这个题当做 ...

随机推荐

  1. 自制spring中bean加载机制,仅做笔记自用

  2. DRF项目之实现用户密码加密保存

    在DRF项目的开发中,我们通过直接使用序列化器保存的用户信息时,用户的密码是被明文保存到数据库中. 代码实现: def create(self, validated_data): '''重写creat ...

  3. tornado5.0+async+await

    不使用数据库的情况下实现异步 使用gen.sleep()模拟阻塞 使用gen.sleep(time) 而不是time.sleep(),time.sleep()阻塞整个进程,看gen.sleep()源码 ...

  4. Django——整体结构/MVT设计模式

    MVT设计模式 Models      封装数据库,对数据进行增删改查; Views        进行业务逻辑的处理 Templates  进行前端展示 前端展示看到的是模板  -->  发起 ...

  5. request.getParameter() 接收参数中文乱码

    修改tomcat配置文件 设置url编码集 <Connector port="8080" protocol="HTTP/1.1" connectionTi ...

  6. 设置进程用指定IE版本

    function IsWOW64: BOOL; begin Result := False; if GetProcAddress(GetModuleHandle(kernel32), 'IsWow64 ...

  7. POJ 3311 Hie with the Pie 最短路+状压DP

    Hie with the Pie Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11243   Accepted: 5963 ...

  8. 文件的概念、标准IO其一

    1.文件的概念 文件是一种存储在磁盘(掉电不丢失存储设备)上,掉电不丢失的一种存储数据的方式,文件在系统中有以下层次的结构来实现. 系统调用.文件IO.标准IO的关系如下: 2.linux系统的文件分 ...

  9. Linux每日练习-crontab

  10. Fragment 知识巩固

    重新学习 Fragment 1.Fragment 的生命周期 想要熟练使用 Fragment,那么必须要弄懂它的生命周期. 我们可以先看一下 Fragment 生命周期和 Activity 生命周期的 ...