首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

POJ 2159 Ancient Cipher:替換+置換密文判斷

     編輯:關於C++

題目大意

給兩個等長大寫字符串 S1(密文)、S2(疑似明文)。判斷 S1 是否可由 S2 經過**任意替換密碼**(單表替換,字母一對一映射)再經**任意置換密碼**(字符重排)得到。長度 ≤ 100。

核心洞見

  • 替換密碼:只改變字符**身份**,不改變**頻率分布**。即 S2 的字母頻率多重集不變。
  • 置換密碼:只改變字符**順序**,不改變**頻率分布**。
  • **組合效果**:S1 與 S2 的**字母頻率多重集完全相同** ⇔ 存在替換+置換變換。
  • 因此:統計兩串各字母出現次數,排序後比較是否完全相等。

算法

  1. 若長度不同 → NO。
  2. 統計 `cnt1[26]`, `cnt2[26]`。
  3. 排序兩個計數數組。
  4. 逐個比較,全等 → YES,否則 NO。

代碼


#include 
#include 
#include 
using namespace std;

int main() {
    char s1[105], s2[105];
    while (gets(s1)) {
        gets(s2);
        int len1 = strlen(s1), len2 = strlen(s2);
        if (len1 != len2) { puts("NO"); continue; }
        int a[26]={0}, b[26]={0};
        for (int i=0;i

易誤區

  • 以為替換密碼有固定規律(如凱撒位移),實際為**任意單表替換**。
  • 忽略置換密碼只打亂順序,不影響頻率。
  • 未排序直接比較原頻率數組(順序不同會誤判)。

複雜度

  • 時間:O(L + 26 log 26) ≈ O(L)。
  • 空間:O(1)。

總結

POJ 2159 看似涉及密碼學,實則是「頻率多重集相等」判斷。關鍵在於理解替換+置換組合後**唯一不變量是字母頻率分布**。排序比較即可,極簡高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved