Codeforces 1295C - Obtain The String
题目大意:
给定两个字符串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的更多相关文章
- Codeforces #541 (Div2) - E. String Multiplication(动态规划)
Problem Codeforces #541 (Div2) - E. String Multiplication Time Limit: 2000 mSec Problem Descriptio ...
- Obtain The String CodeForces - 1295C binary_search+思维
妈耶,,,被B题卡到哭,C题一发就过了... 字符串问题.首先用vector记录每个字符出现的位置,然后对字符串t的每个字符,用二分查找函数查找,注意用upper_bound查找,对于字符i,首先用变 ...
- 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 ...
- 【动态规划】【最短路】Codeforces 710E Generate a String
题目链接: http://codeforces.com/problemset/problem/710/E 题目大意: 问写N个字符的最小花费,写一个字符或者删除一个字符花费A,将当前的字符数量翻倍花费 ...
- codeforces 632C The Smallest String Concatenation
The Smallest String Concatenation 题目链接:http://codeforces.com/problemset/problem/632/C ——每天在线,欢迎留言谈论. ...
- 【Codeforces 1120C】Compress String
Codeforces 1120 C 题意:给一个串\(S\),将这个串分成\(t_1..t_m\),如果\(t_i\)在\(t_1..t_{i-1}\)中作为子串出现过,那么这个的代价是\(b\),否 ...
- CodeForces - 1009B Minimum Ternary String
You are given a ternary string (it is a string which consists only of characters '0', '1' and '2'). ...
- 【codeforces 797C】Minimal string
[题目链接]:http://codeforces.com/contest/797/problem/C [题意] 一开始,给你一个字符串s:两个空字符串t和u; 你有两种合法操作; 1.将s的开头字符加 ...
- Codeforces 1144 E. Median String
原题链接:https://codeforces.com/problemset/problem/1144/E tag:字符串模拟,大整数. 题意:给定两个字符串,求字典序中间串. 思路:可以把这个题当做 ...
随机推荐
- 响应式布局之 px、em、 rem
一.写在前面的话 作为一面前端开发者,对 px .em . rem 应该是再熟悉不过了,但大多数小伙伴应该都和我一样仅仅停留在了解的层面,并不是实质性的掌握它们.本文对三者进行了详细的总结和详细说明, ...
- Gym 101158D(暴力)
题意:给定两个长度为N的字符串,1<=N<=4000,求满足字符串1中的某个区间所有的字母种类和个数都与字符串2中的某个区间相同最长的区间长度. 分析: 1.预处理每个串字母个数的前缀和. ...
- HDU 4915 多校5 Parenthese sequence
比赛的时候想了一个自认为对的方法,WA到死,然后还一直敲下去,一直到晚上才想到反例 找是否存在解比较好找,这种左右括号序列,把(当成1,把)当成-1,然后从前往后扫,+1或者-1 遇到?就当初(,然后 ...
- 【Vue中的坑】Vue打包上传线上报Uncaught SyntaxError: Unexpected token <
今天在vue打包上传线上后,报一下错误,一下就懵了,这可咋整啊,一如既往的想都没想就开始复制错误,上网开搜 Uncaught SyntaxError: Unexpected token < Un ...
- PHP实现简单的双色球机选号码
<?php header('Content-Type: text/html; charset=utf-8'); //PHP实现双色球机选号码 $red = range(1, 33);//初次设定 ...
- python里的反射(自学习)
在做程序开发中,我们常常会遇到这样的需求:需要执行对象里的某个方法,或需要调用对象中的某个变量,但是由于种种原因我们无法确定这个方法或变量是否存在,这是我们需要用一个特殊的方法或机制要访问和操作这个未 ...
- Pillow库的学习和使用
1.encoder jpeg not available sudo apt-get install libjpeg-dev pip install -I pillow
- JAVAEE 和项目开发(第三课:HTTP的请求头和请求方式)
HTTP 协议之请求格式 请求格式的结构:请求行:请求方式.请求的地址和 HTTP 协议版本 请求头:消息报头,一般用来说明客户端要使用的一些附加信息 空行: 位于请求行和请求数据之间,空行是必须 ...
- 二十三、CI框架之post
一.在控制器里面代码如下: 二.在View里面写好按钮和需要post的代码 三.效果如下,点击按钮之前: 点击按钮之后, 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额 ...
- 实验吧Web-难-头有点大(http头伪造:浏览器、国家、.Net framework版本)
进去网站显示: 此处告诉我们要干三件事: (1).net framework 版本为9.9 (2)告诉服务器我们的地址为英国 (3)我们访问站点用的是IE 下面我们就抓的包中伪造. 1:.net fr ...