Codeforces Round #302 (Div. 2)——A—— Set of Strings
You are given a string q. A sequence of k strings s1, s2, ..., sk is called beautiful, if the concatenation of these strings is string q(formally, s1 + s2 + ... + sk = q) and the first characters of these strings are distinct.
Find any beautiful sequence of strings or determine that the beautiful sequence doesn't exist.
The first line contains a positive integer k (1 ≤ k ≤ 26) — the number of strings that should be in a beautiful sequence.
The second line contains string q, consisting of lowercase Latin letters. The length of the string is within range from 1 to 100, inclusive.
If such sequence doesn't exist, then print in a single line "NO" (without the quotes). Otherwise, print in the first line "YES" (without the quotes) and in the next k lines print the beautiful sequence of strings s1, s2, ..., sk.
If there are multiple possible answers, print any of them.
1
abca
YES
abca
2
aaacas
YES
aaa
cas
4
abc
NO
In the second sample there are two possible answers: {"aaaca", "s"} and {"aaa", "cas"}.
大意:给出一个串和一个数字n,问你能不能把大串分成n个小串,满足每一个小串的第一个字母都是不同的
我的搓比代码。先确定最多有多少个串能分,然后标记每一个串的起点,然后根据这个起点进行输出,用vis来标记这个字母是否被访问过
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; char s[150]; int main() { int n; int b[30]; memset(b,-1,sizeof(b)); scanf("%d",&n); getchar(); scanf("%s",s); int ans = 0; for(int i = 0 ; i < strlen(s) ;i++) if(b[s[i]-'a'] == -1){ ans++; b[s[i]-'a'] = i; } int k = 0; int c[30]; int vis[30]; memset(vis,0,sizeof(vis)); if(ans >= n){ printf("YES\n"); for(int i = 0 ; i < strlen(s); i++){ if(b[s[i]-'a']!=-1 && vis[s[i]-'a'] == 0){ c[k++] = b[s[i]-'a']; vis[s[i]-'a'] = 1; } if(k == n) break; } for(int i = 0; i < n -1 ;i++){ for(int j = c[i] ; j < c[i+1] ; j++) printf("%c",s[j]); printf("\n"); } for(int j = c[n-1]; j < strlen(s); j++) printf("%c",s[j]); printf("\n"); } else printf("NO\n"); return 0; }