您的位置:首页 > 其它

Educational Codeforces Round 4 A. The Text Splitting

2015-12-26 17:07 477 查看
[align=center]A. The Text Splitting[/align]
[align=center]time limit per test[/align]
[align=center]1 second[/align]
[align=center]memory limit per test[/align]
[align=center]256 megabytes[/align]
[align=center]input[/align]
[align=center]standard input[/align]
[align=center]output[/align]
[align=center]standard output[/align]
You are given the string s of length
n and the numbers p, q. Split the string
s to pieces of length
p and q.

For example, the string "Hello" for
p = 2, q = 3 can be split to the two strings "Hel" and "lo" or to the two strings "He"
and "llo".

Note it is allowed to split the string s to the strings only of length
p or to the strings only of length
q (see the second sample test).

Input
The first line contains three positive integers n, p, q (1 ≤ p, q ≤ n ≤ 100).

The second line contains the string s consists of lowercase and uppercase latin letters and digits.

Output
If it's impossible to split the string s to the strings of length
p and q print the only number "-1".

Otherwise in the first line print integer k — the number of strings in partition of
s.

Each of the next k lines should contain the strings in partition. Each string should be of the length
p or q. The string should be in order of their appearing in string
s — from left to right.

If there are several solutions print any of them.

Sample test(s)

Input
5 2 3
Hello


Output
2
He
llo


Input
10 9 5
Codeforces


Output
2
Codef
orces


Input
6 4 5
Privet


Output
-1


Input
8 1 1
abacabac


Output
8
a
b
a
c
a
b
a
c


题意:给出一个字符串和整数p、q问是否能按照p、q来划分整个字符串,就是问能不能用p、q凑成字符串的长度。
思路:别人用dp,或者是直接模拟,我当时就只用了dfs,赛后还被hack了,后来改成记忆化dfs,思维还是挺重要的。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
char s[105], put[205];
int c[105], vis[105], u;
int n, p, q;
int dfs(int now, int use, int o)
{
//printf("%d\n", vis[now + use]);
if(vis[now + use] == use) return 0;//同样的方法已经试过
if(now + use > n) return 0;
c[o] = use;
vis[now + use] = use;
if(now + use == n){
u = o;
return 1;
}
if(dfs(now + use, p, o + 1)) return 1;
if(dfs(now + use, q, o + 1)) return 1;
return 0;
}
int main()
{
int i, len, start, have, p1, now, j;
scanf("%d %d %d", &n, &p, &q);
scanf("%s", s);
len = strlen(s);
p1 = now = 0;
if(dfs(0, q, 0)==0&&dfs(0, p, 0)==0){
printf("-1\n");
}else{
//printf("%d\n", u);
i = 0;
while(i <= u)
{
start = c[i++];
for(j = now;j < now + start;j++)
put[p1++] = s[j];
put[p1++] = '\n';
now = now + start;
//printf("%d\n", now);
}
printf("%d\n", u + 1);
printf("%s", put);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: