1. 程式人生 > >例題4-1 古老的密碼 UVa1339

例題4-1 古老的密碼 UVa1339

演算法競賽入門經典(第2版)第4章 函式和遞迴

例題4-1 古老的密碼 UVa1339
感悟。

1、閱讀書中題目,對對映方式(B->A,C->B,...,Z->Y),印象深刻,馬上編碼。

2、但有一組測試樣例無法通過,如下。

HAHA

HEHE

YES
3、上網站下載英文原題,對照翻譯軟體查單詞,仔細閱讀。只讀出替換字母打亂順序,加密方式比較強勁,其他沒讀出個所以然。

5、重新編碼,用了氣泡排序,按字母頻度由小到大排列,提交AC。

附上程式碼

環境Dev-cpp4.9.9.2

#include <stdio.h>
#include <string.h>

char s[100+10],t[100+10];
int cnts[26+10],cntt[26+10];//統計字母出現頻率
void bubblesort(int *cnt){//自小到大排序
    int i,j;
    int len=26;
    int t;
    for(i=0;i<len;i++)
        for(j=i+1;j<len;j++)
            if(cnt[i]>cnt[j]){
                t=cnt[i];
                cnt[i]=cnt[j];
                cnt[j]=t;
            }
}
int main(){
    int i;
    int slen;
    int k;
    int len=26;
    while(scanf("%s%s",s,t)!=EOF){       
        slen=strlen(s);
        k=s[0]-t[0];
        memset(cnts,0,sizeof(cnts));
        memset(cntt,0,sizeof(cntt));
        for(i=0;i<slen;i++){//統計字母出現頻度
            cnts[s[i]-'A']++;
            cntt[t[i]-'A']++;
        }
        bubblesort(cnts);
        bubblesort(cntt);
        for(i=0;i<len;i++)//兩個字串出現頻度是否一致
            if(cnts[i]!=cntt[i])
                break;
        if(len==i)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}