(CodeForces - 612A)The Text Splitting

(CodeForces - 612A)The Text Splitting

time limit per test:1 second
memory limit per test:256 megabytes
input:standard input
output:standard output

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.

Examples

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

题目大意:对于一个有n个字符的字符串,是否可以划分成若干个由p个字符或q个字符组成。如果可以输出一组可行解。(注意可以只有p或q组成)

思路:直接去判断是否有i*p+j*q==n,如果有就可行,输出。

#include<iostream>
#include<string>
using namespace std;

const int maxn=105;
string s,ans[maxn];

int main()
{
    int n;
    while(cin>>n)
    {
        int p,q;
        cin>>p>>q>>s;
        bool flag=false;
        int tot=0;
        for(int i=0;i*p<=n;i++)
        {
            for(int j=0;j*q<=n;j++)
                if(i*p+j*q==n)
                {
                    flag=true;      
                    for(int k=0;k<i*p;k+=p)
                        ans[tot++]=s.substr(k,p);
                    for(int k=i*p;k<n;k+=q)
                        ans[tot++]=s.substr(k,q);
                    break;
                }
            if(flag) break;
        } 
        if(flag) 
        {
            cout<<tot<<endl;
            for(int i=0;i<tot;i++)
                cout<<ans[i]<<endl;
        }
        else cout<<-1<<endl;
    }
    return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值