因为计算子串的时候是可覆盖的,如ababab中有两个abab,所以构造的时候应该根据nxt数组的性质来构造,每次贪心的跳到nxt[ j ]
int sum[2];
string s,t;
int nxt[MAXN];
void get_nxt(const string & x)
{
nxt[0]=-1;
int i=0,j=-1;
int n=sz(x);
while(i<n)
{
if(j<0||x[i]==x[j]) nxt[++i]=++j;
else j=nxt[j];
}
}
void solve()
{
cin>>s>>t;
int n=sz(s),m=sz(t);
get_nxt(t);
rep(i,n) ++sum[s[i]-'0'];
int j=0;
while(sum[0]&&sum[1])
{
if(j==m) j=nxt[j];
if(sum[t[j]-'0'])
{
cout<<t[j];
--sum[t[j]-'0'];
++j;
}
else j=nxt[j];
}
while(sum[0]--) cout<<'0';
while(sum[1]--) cout<<'1';
cout<<endl;
}
signed main()
{
solve();
return 0;
}