Codeforces Round #570 (Div. 3) E - Subsequences (easy version) (广搜)

🍤 🍤 🍤

题意:从一个字符串中找到k个不重复的子序列,删除的字符数之和最小为多少

最先想到的肯定是只删除一个,接着就是只删除两个。。。应该想到使用队列按顺序检验字符串,有点像那个在房子旁边安排人的题,那个也是从最靠近的部分开始贪心,还有就是string 中使用erase这个函数,如果不希望原字符串改变,一定要先把原字符串拷贝一下QAQ

signed main()
{
	int n,k;cin>>n>>k;
	string c;cin>>c;
	queue<string>q;
	set<string>s;
	q.push(c);s.insert(c);
	int ans=0;
	while(q.size()&&s.size()<k)
	{
		c=q.front();q.pop();
		for(int i=0;i<c.size();++i)
		{
			string v=c;
			v.erase(i,1);
			if(s.count(v)==0)
			{
				q.push(v),s.insert(v);
				ans+=n-(v.size());
				if(s.size()==k) break;
			}
		}
	}
	if(s.size()<k) cout<<"-1"<<endl;
	else cout<<ans<<endl;
	//stop;
	return 0;
}
posted @ 2020-01-16 14:44  Herlo  阅读(147)  评论(0)    收藏  举报