# String Manipulation# Conditional Statements# Bit Manipulation# Decoding

e910 - 108 p10. 解碼問題

🔗 前往 ZeroJudge 原題

題目描述

題目給定一個由 0 和 1 組成的字串,並提供一個編碼表,將這些二進位碼轉換為對應的英文字母、數字或符號。目標是將輸入的二進位字串解碼成可讀的字串。

解題思路

這題的核心是根據題目提供的編碼表,將輸入的二進位字串逐步解碼。由於編碼表中的每個字元對應的二進位碼長度不一,因此需要使用大量的條件判斷來判斷當前二進位碼對應哪個字元。程式碼透過不斷檢查字串的前幾位,並根據這些位數與編碼表進行比對,來確定要輸出哪個字元,然後移動到字串的下一個位置。

複雜度分析

  • 時間複雜度: O(n),其中 n 是輸入字串的長度。因為程式碼需要遍歷輸入字串的每個位元,並且在每個位元上執行常數時間的操作(比較和判斷)。
  • 空間複雜度: O(1),因為程式碼只使用了常數額外的空間來儲存變數,例如 code 字串、lengthoutput

程式碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char code[500000];
int main(void) {
 scanf("%s", code);
 int length=strlen(code);
 char output;
 int i=0;
 while(i<length) {
  if(code[i]=='0') {//0
   if(code[i+1]=='0') {//00
    output=' ';
    i+=2;
   } else {//01
    if(code[i+2]=='0') {//010
     if(code[i+3]=='0') {//0100
      if(code[i+4]=='0') {//01000
       output='M';
       i+=5;
      } else {//01001
       if(code[i+5]=='0') {//010010
        output='.';
        i+=6;
       } else {//010011
        output='P';
        i+=6;
       }
      }
     } else {//0101
      if(code[i+4]=='0') {//01010
       output='F';
       i+=5;
      } else {//01011
       if(code[i+5]=='0') {//010110
        output='G';
        i+=6;
       } else {//010111
        if(code[i+6]=='0') {//0101110
         if(code[i+7]=='0') {//01011100
          if(code[i+8]=='0') {//010111000
           output='2';
           i+=9;
          } else {//010111001
           output='Q';
           i+=9;
          }
         } else {//01011101
          if(code[i+8]=='0') {//010111010
           if(code[i+9]=='0') {//0101110100
            if(code[i+10]=='0') {//01011101000
             output='!';
             i+=11;
            } else {//01011101001
             output='7';
             i+=11;
            }
           } else {//0101110101
            output='5';
            i+=10;
           }
          } else {//010111011
           output='0';
           i+=9;
          }
         }
        } else {//0101111
         if(code[i+7]=='0') {//01011110
          output=',';
          i+=8;
         } else {//01011111
          if(code[i+8]=='0') {//010111110
           if(code[i+9]=='0') {//0101111100
            if(code[i+10]=='0') {//01011111000
             output='J';
             i+=11;
            } else {//01011111001
             if(code[i+11]=='0') {//010111110010
              if(code[i+12]=='0') {//0101111100100
               output='?';
               i+=13;
              } else {//0101111100101
               output='9';
               i+=13;
              }
             } else {//010111110011
              output='4';
              i+=12;
             }
            }
           } else {//0101111101
            output='X';
            i+=10;
           }
          } else {//010111111
           output='K';
           i+=9;
          }
         }
        }
       }
      }
     }
    } else {//011
     if(code[i+3]=='0') {//0110
      output='I';
      i+=4;
     } else {//0111
      output='N';
      i+=4;
     }
    }
   }
  } else {//1
   if(code[i+1]=='0') {//10
    if(code[i+2]=='0') {//100
     if(code[i+3]=='0') {//1000
      output='A';
      i+=4;
     } else {//1001
      output='O';
      i+=4;
     }
    } else {//101
     if(code[i+3]=='0') {//1010
      if(code[i+4]=='0') {//10100
       output='L';
       i+=5;
      } else {//10101
       output='H';
       i+=5;
      }
     } else {//1011
      if(code[i+4]=='0') {//10110
       output='C';
       i+=5;
      } else {//10111
       if(code[i+5]=='0') {//101110
        output='Y';
        i+=6;
       } else {//101111
        output='U';
        i+=6;
       }
      }
     }
    }
   } else {//11
    if(code[i+2]=='0') {//110
     if(code[i+3]=='0') {//1100
      output='T';
      i+=4;
     } else {//1101
      if(code[i+4]=='0') {//11010
       output='D';
       i+=5;
      } else {//11011
       if(code[i+5]=='0') {//110110
        output='B';
        i+=6;
       } else {//110111
        if(code[i+6]=='0') {//1101110
         output='W';
         i+=7;
        } else {//1101111
         if(code[i+7]=='0') {//11011110
          if(code[i+8]=='0') {//110111100
           output='1';
           i+=9;
          } else {//110111101
           if(code[i+9]=='0') {//1101111010
            if(code[i+10]=='0') {//11011110100
             output='6';
             i+=11;
            } else {//11011110101
             output='8';
             i+=11;
            }
           } else {//1101111011
            if(code[i+10]=='0') {//11011110110
             output='Z';
             i+=11;
            } else {//11011110111
             output='3';
             i+=11;
            }
           }
          }
         } else {//11011111
          output='V';
          i+=8;
         }
        }
       }
      }
     }
    } else {//111
     if(code[i+3]=='0') {//1110
      if(code[i+4]=='0') {//11100
       output='R';
       i+=5;
      } else {//11101
       output='S';
       i+=5;
      }
     } else {//1111
      output='E';
      i+=4;
     }
    }
   }
  }
  printf("%c", output);
 }
 
 return 0;
}

Discussion