璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:912c_did_we_get_everything_covered
problems
名称Did We Get Everything Covered?
题目编号912C
题目链接codeforces.com/…
来源CodeForces
算法分类贪心, 字符串
难易程度看懂题解

Did We Get Everything Covered?

想法

逆向思维,构造反例。每次将最后一次出现的k个字母中的最后一个加入答案,直到答案长度为m或者原字符串枚举完。相当于被迫取一个最差的子序列,k个字母中最后一个出现的字母使得不重复的同时,尽可能取的往后。

当答案长度为m,说明存在答案。当原字符串枚举完,选一个最后一组k字母中没出现的字母作为答案的最后一个,将答案填满,作为最坏的样例。

代码实现

#include<cstdio>
#include<cstring>
 
int n, k, m;
char line[1010], ans[1010];
bool vis[30];
 
int main() {
	int T;
	scanf("%d\n", &T);
	while(T--) {
		memset(ans, 0, sizeof(ans));
		memset(vis, false, sizeof(vis));
		scanf("%d %d %d\n%s", &n, &k, &m, line);
		int curr = -1, cnt = 0, len = 0;
		while(curr < m-1 && len < n) {
			curr++;
			if(vis[line[curr]-'a'])
				continue;
			vis[line[curr]-'a'] = true;
			cnt++;
			if(cnt == k) {
				ans[len++] = line[curr];
				cnt = 0;
				memset(vis, false, sizeof(vis));
			}
		}
		if(len == n) {
			printf("YES\n");
			continue;
		}
		int temp = 0;
		for(int i=0; i<k; i++) 
			if(!vis[i]) {
				temp = i;
				break;
			}
		while(len < n) {
			ans[len++] = 'a'+temp;
		}
		printf("NO\n%s\n", ans);
	}
	return 0;
}
/app/www/public/data/pages/icpc/problems/912c_did_we_get_everything_covered.txt · 最后更改: 2024/02/05 15:23 由 温婕莺