竹園論壇

標題: TOJ - 64 [打印本頁]

作者: jd3    時間: 2014-5-29 23:01
標題: TOJ - 64
本帖最後由 jd3 於 2014-6-2 00:58 編輯


我的解碼code在自己的電腦能跑出正確的文字
可是同樣的文字如果直接輸出會AC,用下面的code則會WA
YYYYYYYYYYYYYYYYYYYYYYY?
#include<iostream>
  • #include<cstdio>
  • #include<cstring>

  • using namespace std;

  • char TA[100];
  • char TAB[100];
  • char TB[100];
  • char T[100];
  • char A[100];
  • char B[100];

  • string str;


  • char change(char c)
  • {
  •     if('0' <= c && c <= '9')
  •         return c-'0';
  •     return c-'A'+10;
  • }


  • int main()
  • {
  •     int len;
  •    
  •     str = "207A35304765D69D9670F53856584E952BCDE2F8CA939CC01F82840E2934071EC91F7058";
  •     len = str.size();
  •    
  •    
  •     for(int i = 0 ; i < len ; i+=2, TA[i]='\0')
  •         TA[i/2] = (change(str[i])<<4)+change(str[i+1]);
  •    
  •     str = "FD34A487207AC50873EF2AB01243AEF677D4B40ADD7A82F1C9FFB0B2394F7199F590DA97";
  •     for(int i = 0 ; i < len ; i+=2, TAB[i]='\0')
  •         TAB[i/2] = (change(str[i])<<4)+change(str[i+1]);
  •    
  •     str = "76EC54D8C05EB5FB53436FC2E0C457339DDBFA31BA42B8707EDE807DBBA6D0C6905419B4";
  •     for(int i = 0 ; i < len ; i+=2, TB[i]='\0')
  •         TB[i/2] = (change(str[i])<<4)+change(str[i+1]);
  •    
  •    
  •    
  •     for(int i = 0 ; i < len/2 ; i++)
  •         B[i] = TA[i] ^ TAB[i];
  •    
  •     for(int i = 0 ; i < len/2 ; i++)
  •         T[i] = TB[i] ^ B[i];
  •    
  •     T[len/2] = '\0';
  •    
  •    
  •     puts(T);
  •    
  •     return 0;
  • }




  • 作者: tntchn    時間: 2014-5-30 19:29
    本帖最後由 tntchn 於 2014-5-31 11:32 編輯

    這是編碼不同的原因

    以「哈囉你」這三個字做舉例
       BIG5: AB A2 C5 6F A7 41
    Unicode: 54 C8 56 C9 4F 60
      UTF-8: E5 93 88 E5 9B 89 E4 BD A0


    而這題16進位的答案的前面一小段 ABA2C56FA741
    在Windows下編譯執行,字元編碼就是BIG5,輸出當然就是「哈囉你」
    但像我在OS X的Xcode執行,字元編碼是UTF-8
    ........... 這個跑出來的東西有點難形容,用一張截圖最能把輸出的東西完整呈現OAO



    在TOJ下大概也是輸出這個東西
    所以當然會WA囉

    對了
    小弟資稟不高
    在OS X下解這題的方式不外乎:
    一個一個字查全字庫

    切Windows

    有沒有人可以提供在OS X下更快速、更自動化的解題方式呢??

    作者: domen111    時間: 2014-5-30 21:44
    的確是編碼問題,windows上沒問題,上傳ideone變成沒有輸出,oj的系統應該和ideone一樣都是linux。
    mac的預設編碼居然是unicode有點驚訝,提供一個方法就是,輸出到檔案用文字編輯器選big5開啟。

    剛剛寫的code:
    #include<iostream>
  • #include<sstream>
  • using namespace std;
  • char hex2char(char hex1,char hex2)
  • {
  •         int c=0;
  •         string s; s+=hex1; s+=hex2;
  •         istringstream ss(s);
  •         ss>>hex>>c;
  •         return c;
  • }
  • int main()
  • {
  •         string a,b,c;
  •         ostringstream oss;
  •         a="207A35304765D69D9670F53856584E952BCDE2F8CA939CC01F82840E2934071EC91F7058";
  •         b="FD34A487207AC50873EF2AB01243AEF677D4B40ADD7A82F1C9FFB0B2394F7199F590DA97";
  •         c="76EC54D8C05EB5FB53436FC2E0C457339DDBFA31BA42B8707EDE807DBBA6D0C6905419B4";
  •         //cin>>a>>b>>c;
  •         for(int i=0;i<a.size();i+=2)
  •         {
  •                 int ha,hb,hc;
  •                 ha=hex2char(a[i],a[i+1]);
  •                 hb=hex2char(b[i],b[i+1]);
  •                 hc=hex2char(c[i],c[i+1]);
  •                 oss<<char(ha^hb^hc);
  •         }
  •         cout<<oss.str()<<endl;
  • }



  • 作者: Sylveon    時間: 2014-5-30 22:04
    我補充一下本題的make data給大家參考我沒有mac可以測試,可以試試看

    @T16-2 E.風聲
  • #include<cstdio>
  • #include<iostream>
  • #include<cstring>
  • #include<ctime>
  • #include<cstdlib>
  • using namespace std;
  • typedef unsigned char UCHAR;
  • void makeKey(UCHAR s[],int len){
  •     for(int i=0;i<len;++i)
  •         s[i]=rand()%256;
  •     s[len]=0;
  • }
  • void HEX(UCHAR s[],int len){
  •     for(int i=0;i<len;++i)
  •         printf("%02X",s[i]);
  •     printf("\n");
  • }
  • void XOR(const UCHAR a[],const UCHAR b[],UCHAR c[],int len){
  •     for(int i=0;i<len;++i){
  •         c[i]=a[i]^b[i];
  •     }
  •     c[len]=0;
  • }
  • int main(){
  •     srand(time(NULL));
  •     UCHAR S[]="哈囉你好嗎衷心感謝珍重再見期待再相逢";
  •     UCHAR A[40],B[40],TA[40],TAB[40],TB[40];
  •     int len=strlen((char*)S);
  •     makeKey(A,len);
  •     makeKey(B,len);
  •    
  •     cout<<"Key Len:"<<len<<endl;
  •     cout<<"===========AC==========\n";
  •     HEX(S,len);
  •     cout<<"===========A===========\n";
  •     HEX(A,len);
  •     cout<<"===========B===========\n";
  •     HEX(A,len);
  •     cout<<endl;
  •    
  •     //TA
  •     XOR(S,A,TA,len);
  •     //TAB
  •     XOR(TA,B,TAB,len);
  •     //TB
  •     XOR(TAB,A,TB,len);
  •     //User Get
  •     cout<<"Input:"<<endl;
  •     cout<<"===========TA==========\n";
  •     HEX(TA,len);
  •     cout<<"===========TAB=========\n";
  •     HEX(TAB,len);
  •     cout<<"===========TB==========\n";
  •     HEX(TB,len);
  •    
  •     UCHAR cB[60],ans[40];
  •     cout<<"check : \n";
  •     XOR(TA,TAB,cB,len);
  •     XOR(cB,TB,ans,len);
  •     cout<<endl;
  •     cout<<"===========TB==========\n";
  •     HEX(ans,len);
  •     puts((char*)ans);
  • }


  • 作者: Sylveon    時間: 2014-5-30 23:50
    Linux下的字元集是UTF-8,與Windows下的BIG5不同,要使用local的字串形式讓編譯器自動編碼才不會WA




    歡迎光臨 竹園論壇 (http://forum.tfcis.org/) Powered by Discuz! X3.2