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 由 温婕莺