570 div 3 E - Subsequences (easy version)
Posted baihualiaoluan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了570 div 3 E - Subsequences (easy version)相关的知识,希望对你有一定的参考价值。
传送门:https://codeforces.com/contest/1183/problem/E
题面描述:
给你一个长度为n的字符串,你可以从中删掉字母(也可以不删),将这样得到的一个字符串放进一个集合s中,让你求一个容量大小为k的集合的最小花费,整个集合的花费是由集合内所有字符串花费的和,每个字符串的花费是 |n-该字符串的长度|。如果不可能组成大小为k的集合,输出-1,否则,输出最小花费。
思路:
这个题的思路有点意思,是字符串bfs,概括来说,就是先从删一个字符开始,将原串删掉一个字符的所有字串都用一个set存起来,,接下来枚举删掉两个字符的串,即在删掉一个字母的字串的基础上再删掉一个字符,直到队列为空或者set的大小达到k结束bfs。
代码:
#include <bits/stdc++.h> using namespace std; int main() int n,k; cin >> n >> k; string s; cin >> s; int ans = 0; queue<string> q; set<string> st; q.push(s); st.insert(s); while(!q.empty()&&int(st.size()<k)) string v = q.front(); q.pop(); for(int i = 0; i<int(v.size()); ++i) string nv = v; nv.erase(i,1); if(!st.count(nv) && int(st.size())+1 <=k) q.push(nv); st.insert(nv); ans += n - nv.size(); if(int(st.size()<k)) cout << -1 <<endl; else cout << ans << endl; return 0;
以上是关于570 div 3 E - Subsequences (easy version)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value(鸽巢原理)
Codeforces Round #570 (Div. 3 )A
Codeforces Round #570 (Div. 3) B. Equalize Prices
Codeforces Round #648 (Div. 2) E. Maximum Subsequence Value 贪心
Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)