第一次没看懂题意,用的朴素字符串匹配,排列n个第二个字符串,直到第一个剩下的不足以构成第二个字符串,然后wa了。
实际上应该使用kmp的next数组,把第二个字符串的真前后缀相同部分减去掉,然后重复上述过程即可。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
#include <stdlib.h>
//#include <windows.h>
using namespace std;
//for(i=1;i<n;i++)
//scanf("%d",&n);
//printf("\n",);
char ch[501000],ans[501000];
int nex[501000];
int main()
{
int i,n,m,j,k,l,zero=0,one=0;
scanf("%s",ch);
scanf("%s",ans);
l=strlen(ch);
n=strlen(ans);
for(i=0;i<l;i++)
{
if(ch[i]=='0') zero++;
else one++;
}
nex[0]=-1;
k=-1;
j=0;
while(j<l)
{
if(k==-1||ans[j]==ans[k])
{
k++;j++;nex[j]=k;
}
else k=nex[k];
}
//l-()
n-=nex[n];
j=0;
for(i=0;i<l;i++)
{
if(zero==0)
cout<<1;
else if(one==0)
cout<<0;
else
{
if(ans[j]=='1')
{
cout<<1;one--;
}
else
{
cout<<0;zero--;
}
j++;
j%=n;
}
}
return 0;
}