Codeforces 1473B - String LCM

          方法比较笨,暴力通过的。

          把a设为长串,b为短串。分3种情况,1)两个串都只有一种字符,那只需要比较a[0]和b[0]是否为同一字符就可以了;2)有一串一种字符,一串两种,那就直接可以输出-1了;3)两串两种字符都有,首先要求b串是可以遍历a串的,中间有不相等的地方就是-1了,遍历完了之后a串可能还会剩下几个字符长度小于b,所以b遍历不了剩余的小串;想要a和b有LCM,那这剩余的小串就一定可以把b给遍历了,否则就是-1。

          最后算出a和b串长度的最小公倍数,一种输出b串直到长度为最小公倍数就可以了。

#include <iostream>
#include<string>
#include<algorithm>
//#include<map>
using namespace std;
typedef long long ll;
/*bool cmp(ll a,ll b)
{
    return a>b;
}*/
int main()
{
    ll t,x,y,i,la,lb,f;
    char ch;
    string a,b;
    cin>>t;
    while(t--)
    {
        cin>>a>>b;
        x=0;
        f=0;
        if(a.length()<b.length())swap(a,b);//a为较长的字符串
        lb=b.length();
        la=a.length();
        for(i=0; i<la; i++)
        {
            if(i==0)ch=a[0];
            else if(ch!=a[i])
            {
                f++;//a字符串中有2种字符
                break;
            }
        }
        for(i=0; i<lb; i++)
        {
            if(i==0)ch=b[0];
            else if(ch!=b[i])
            {
                f++;//b字符串中有2种字符
                break;
            }
        }
        if(f==0)//a和b中都只有一种字符
        {
            if(a[0]==b[0])f=100;//不一样说明凑不出符合条件的字符串
            else f=0;
        }
        else if(f==1)f=0;//有一个字符串两种字符,另一个字符串只有一种字符,肯定不行的
        else
        {

                for(i=0; i<la; i++)//用b串遍历a串
                {
                    if(a[i]!=b[i%lb])
                    {
                        f=0;//a中有部分不符合b串,那就找不出都能除余两者的字符串
                        break;
                    }
                }
                if(f!=0&&la%lb){//找a中循环若干b后剩余的字符串是否是b的子串
               x=la%lb;//a中剩余的串
               x=lb-x;
               y=x;
               for(i=0;i<lb;i++){
                if(b[i]!=a[y]){//a中剩余部分不是b的字串,不符题意
                    f=0;
                    break;
                }
                y++;
                if(y==lb)y=x;
               }
              if(f!=0)f=100;
                }
                else if(f!=0&&la%lb==0)f=100;//说明b串刚好完全把a串填补完,没有剩余

        }

         if(f==100){

        for(i=(la/lb)*lb;; i+=lb)//求其最小公倍数
        {
            if(i%lb==0&&i%la==0)break;
        }
        for(x=0; x*lb<i; x++)//小于最小公倍数就输出b字符串
        {
            cout<<b;
        }
        cout<<endl;
    }
    else cout<<-1<<endl;//找不到符合条件的字符串
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值