首先把两个序列相加得到初始序列.之后就对初始序列进行调整:
对于f[i]>=2的情况可以根据2*f[i]=f[i]+f[i-1]+f[i-2]=f[i+1]+f[i-2]转化为f[i-2]++,f[i+1]++.
对于f[i]=1&&f[i+1]=1,根据f[i+2]=f[i]+f[i-1]转化为给f[i+2]赋值.
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int M=1e6+5;
int n,m,A[M],B[M],C[M];
inline void sc(int x){
if(x)putchar('1');
else putchar('0');
}
inline void rd(int &res){
res=0;char c;
while(c=getchar(),c<48);
do res=(res<<1)+(res<<3)+(c^48);
while(c=getchar(),c>=48);
}
void Up(int k){
while(C[k]){
C[k]=0;
C[k-1]=0;
C[k+1]++;
k=k+2;
}
}
void trans(int i){
if(C[i]<2)return;
int k=i-2;
if(i==2)k++;
if(i>1)C[k]++;
C[i+1]++;
C[i]-=2;
}
int main(){
int tot=0,i,j,k,len;
rd(n);
for(i=1;i<=n;i++)rd(A[i]);
rd(m);
for(j=1;j<=m;j++)rd(B[j]);
len=max(n,m);
int L=0,R=0;
for(i=len;i>=1;i--){
C[i]+=A[i]+B[i];
if(C[i]>=2){
trans(i);
trans(i+1);
if(i==1)trans(1);
}
if(C[i])Up(i+1);
if(C[i+1])Up(i+2);
if(C[i+2])Up(i+3);//
}
while(C[len+1])len++;
if(C[len+2])len+=2;
while(C[len+1])len++;
printf("%d ",len);
for(i=1;i<len;i++){
sc(C[i]);
putchar(' ');
}
sc(C[len]);
return 0;
}