給定一個替換表(第 i 個字母用哪個字母表示),以及一個字符串,前半部為密文,後半部為明文(密文完整,明文可能不全)。利用替換表將密文轉為明文,再用 KMP 求出明文的最長前綴與密文轉換後字符串的最長後綴匹配,從而還原完整字符串。
a1(26 字母映射)和目標串 a2。a2 前半為密文,後半為明文。設 len = strlen(a2),明文部分為 a3 = a2 + (len+1)/2。a2 整體按替換表轉換為明文字符(即密文按表解密)。next 數組。a3(明文後綴)在轉換後串中的位置,找到最長匹配前綴長度 flag。a3 覆蓋的部分(即 a2[flag ... len-flag-1])。邏輯圖解
原始 a2: [ 密文 (完整) ][ 明文 (部分) ] |←--- len ---→| 轉換後 a2: [ 明文全文 (由密文解密得) ] ↑ KMP 匹配 a3 (明文後綴) 找到最長前綴匹配長度 flag 最終輸出: 密文 + 轉換後明文[flag ... len-flag-1]關鍵點
a1 索引 0~25 對應 'a'~'z',a1[j] 是密文中代表明文 'a'+j 的字符。解密時查找 a2[i] == a1[j] 則明文為 'a'+j。字符串長度 ≤ 1e5,KMP O(n),總時間 O(T·n),空間 O(n),完全滿足限制。