查看: 1394|回復: 4
打印 上一主題 下一主題

[解決] TOJ - 64

[複製鏈接]
  • TA的每日心情
    鬱悶
    2015-5-15 22:38
  • 簽到天數: 33 天

    [LV.5]常住居民I

    75

    主題

    302

    帖子

    766

    積分

    版主

    TFcis - 105 附設監工官

    Rank: 7Rank: 7Rank: 7

    積分
    766

    台南一中資訊社程式設計達人 - 2014

    跳轉到指定樓層
    樓主
    發表於 2014-5-29 23:01:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

    趕快加入我們來參與討論吧!

    您需要 登錄 才可以下載或查看,沒有帳號?加入我們

    x
    本帖最後由 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;
  • }



  • <這是個人簽名欄位>
    回復

    使用道具 檢舉

  • TA的每日心情
    鬱悶
    2014-9-27 02:19
  • 簽到天數: 23 天

    [LV.4]偶爾看看III

    12

    主題

    94

    帖子

    976

    積分

    高級會員

    Rank: 4

    積分
    976

    熱心會員

    頭香
    發表於 2014-5-30 19:29:09 | 只看該作者
    本帖最後由 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下更快速、更自動化的解題方式呢??
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    開心
    2015-4-12 10:09
  • 簽到天數: 137 天

    [LV.7]常住居民III

    142

    主題

    686

    帖子

    3559

    積分

    邁向天堂

    蘇多門

    Rank: 8Rank: 8

    積分
    3559

    新手達陣台南一中資訊社程式設計達人 - 2014

    3#
    發表於 2014-5-30 21:44:12 | 只看該作者
    的確是編碼問題,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;
  • }


  • 蘇多門 domen111
    My Web: https://sites.google.com/site/domenprg/
    回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    4#
    發表於 2014-5-30 22:04:21 | 只看該作者
    我補充一下本題的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);
  • }

  • 回復 支持 反對

    使用道具 檢舉

  • TA的每日心情
    慵懶
    2015-4-10 14:18
  • 簽到天數: 78 天

    [LV.6]常住居民II

    176

    主題

    612

    帖子

    3959

    積分

    管理員

    Rank: 9Rank: 9Rank: 9

    積分
    3959

    台南一中資訊社新手達陣程式設計達人 - 2014

    5#
    發表於 2014-5-30 23:50:12 | 只看該作者
    Linux下的字元集是UTF-8,與Windows下的BIG5不同,要使用local的字串形式讓編譯器自動編碼才不會WA
    回復 支持 反對

    使用道具 檢舉

    您需要登錄後才可以回帖 登入 | 加入我們

    本版積分規則

    快速回覆 返回頂部 返回列表