2012 5 22 词编码

#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了一次。。。。真是令人汗颜。

原文地址:https://www.cnblogs.com/spwkx/p/2518590.html