The Text Splitting

本文介绍了一种字符串分割算法,该算法能够将输入的字符串按照指定长度p和q进行分割,并输出所有可能的分割方式。文章提供了完整的AC代码实现,通过循环遍历所有可能的组合来寻找可行的分割方案。
E - The Text Splitting
Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u

Description

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 = 2q = 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 Input

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

AC代码:
#include <cstdio>
int main()
{
	int l,p,q;
	char s[111];
	int ant1,ant2;		//两个循环次数 
	while (~scanf ("%d %d %d",&l,&p,&q))
	{
		scanf ("%s",s+1);
		if (l % p == 0)
		{
			printf ("%d\n",l / p);
			for (int i = 1 ; i <= l ; i++)
			{
				printf ("%c",s[i]);
				if (i % p == 0)
					printf ("\n");
			}
		}
		else if (l % q == 0)
		{
			printf ("%d\n",l / q);
			for (int i = 1 ; i <= l ; i++)
			{
				printf ("%c",s[i]);
				if (i % q == 0)
					printf ("\n");
			}
		}
		else
		{
			bool ans = false;
			for (int i = 1 ; i <= 100 ; i++)
			{
				if (i * p > l)
				{
					ans = false;
					break;
				}
				for (int j = 1 ; j <= 100 ; j++)
				{
					if (j * q > l)
						break;
					if (i * p + j * q == l)
					{
						ant1 = i;
						ant2 = j;
						ans = true;
					}
				}
				if (ans)
					break;
			}
			if (ans)
			{
				printf ("%d\n",ant1+ant2);
				int pos = 1;
				for (int i = 1 ; i <= ant1 ; i++)
				{
					for (int j = 1 ; j <= p ; j++)
						printf ("%c",s[pos++]);
					printf ("\n");
				}
				for (int i = 1 ; i <= ant2 ; i++)
				{
					for (int j = 1 ; j <= q ; j++)
						printf ("%c",s[pos++]);
					printf ("\n");
				}
			}
			else
				printf ("-1\n");
		}
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值