方法比较笨,暴力通过的。
把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;//找不到符合条件的字符串
}
}