#include<iostream> #include<string.h> #include<algorithm> using namespace std; int n; char a[1100]; int main( ) { cin>>n; while(~scanf("%s",&a)) { int chang=strlen(a); int sum=0; int sum1=0; for(int i=0;i<chang;i++) { if(a[i]=='1') { sum=sum+(i+1); sum1++; } } if(sum%(n+1)==0&&chang==n) { cout<<a<<endl; } else { int ok=0; if(chang==n) { for(int i=0;i<chang;i++) { if((sum-(i+1))%(n+1)==0&&a[i]=='1') { a[i]='0'; cout<<a<<endl; ok=1; break; } } } if((sum+sum1)%(n+1)==0&&ok==0&&chang==n-1) { cout<<0; for(int i=0;i<chang;i++) { cout<<a[i]; } cout<<endl; ok=1; } if((sum+sum1+1)%(n+1)==0&&ok==0&&chang==n-1) { cout<<1; for(int i=0;i<chang;i++) { cout<<a[i]; } cout<<endl; ok=1; } if(ok==0&&chang==n-1) { int sum2=0; for(int i=0;i<chang;i++) { if(a[i]=='1') { sum2++; } if((sum+(sum1-sum2))%(n+1)==0) { for(int j=0;j<=i;j++) { cout<<a[j]; } cout<<'0'; for(int j=i+1;j<chang;j++) { cout<<a[j]; } cout<<endl; ok=1; break; } if((sum+i+2+(sum1-sum2))%(n+1)==0) { for(int j=0;j<=i;j++) { cout<<a[j]; } cout<<'1'; for(int j=i+1;j<chang;j++) { cout<<a[j]; } cout<<endl; ok=1; break; } } } if(ok==0&&chang==n+1) { int sum2=0; for(int i=0;i<chang;i++) { if(a[i]=='1') { sum2++; } if((sum-(i+1)-(sum1-sum2))%(n+1)==0&&a[i]=='1') { for(int j=0;j<i;j++) { cout<<a[j]; } for(int j=i+1;j<chang;j++) { cout<<a[j]; } cout<<endl; ok=1; break; } if((sum-(sum1-sum2))%(n+1)==0&&a[i]=='0') { for(int j=0;j<i;j++) { cout<<a[j]; } for(int j=i+1;j<chang;j++) { cout<<a[j]; } cout<<endl; ok=1; break; } } } if(ok==0) cout<<-1<<endl; } } return 0; }
1. 词编码
一个发送机可以通过一条隧道发送一些以二进制代码组成的单词。,在其尽头的接收机可以使用特殊技术恢复到最初的单词。每个单词最初都由0和1组成。所有的单词最初长上簦都为n(4≤N ≤1000)。当穿过隧道之后单词可能发生以下几种情况之一:
(1)任意(一个)0被1取代
(2)任意(一个)符号被删除
(3)一个符号(0或1)被插入到任何位置
(4)不改变
我们知道最初的单词都具有以下性质:有1的位置号的总和是N+1的倍数,或者是0。
【input】
N和转换后的单词,每个单词占一行。单词数不大于2001.不会有其它任何东西,除了一些空格与空行,
【Output】
你的程序应该打印输出原始序列的词,注意换行。
若有多解,操作4优先,不行则按操作1,2,3优先。同一操作,按操作位置最先的优先。同一操作,按操作位置最先的优先(从左到右数起l,2,3,…N),还有操作2时,被删数列,先在被删数列添0,不行再添l。
如果没答案输出-1
【Sample input】
4
0000
011
101l
1l011
【Sample Output】
0000
0110
1001
111l
这是个很简单的模拟,但竟然W了一次。。。。真是令人汗颜。