1. 程式人生 > 其它 >H. Hamming Distance(貪心)

H. Hamming Distance(貪心)

技術標籤:比較有意思的題(可以禍害學弟學妹的題)

傳送門

構造一個字典序最小的字串使得到 a , b a,b a,b兩串的漢明距離相等。


很明顯大多數時候填 ′ a ′ 'a' a會比較優秀

因為字典序的比較關係,只要這一位能填 ′ a ′ 'a' a,我們就應該無腦填 ′ a ′ 'a' a

我們記 n o w d i s nowdis nowdis a 距 離 − b 距 離 a距離-b距離 ab,最後 n o w d i s nowdis nowdis應該是 0 0 0

明顯當 a , b a,b a,b串字母相同時,本位不管放什麼都不會影響 n o w d i s nowdis

nowdis

a , b a,b a,b串不同時,我既可以讓 n o w d i s nowdis nowdis不變,也可以 n o w d i s + + nowdis++ nowdis++,也可以 n o w d i s − − nowdis-- nowdis

所以這就是 n o w d i s nowdis nowdis的鬆弛度,即為字尾中不同字母的數量

只要字尾字母的鬆弛度大於等於 a b s ( n o w d i s ) abs(nowdis) abs(nowdis),我就放 ′ a ′ 'a' a

程式碼中其實也就是列舉每一個字母放而已

#include <bits/stdc++.h>
using namespace std; const int maxn = 1e6+10; int t,n,casenum,f[maxn],nowdis; char a[maxn],b[maxn]; bool isok(char w,int index ) { int now = nowdis; if( w!=a[index] ) now++; if( w!=b[index] ) now--; return abs(now)<=f[index+1]; } int main() { cin >> t; while( t-- ) { scanf("%s%s"
,a+1,b+1 ); n = strlen( a+1 ); f[n+1] = 0; for(int i=n;i>=1;i--) { f[i] = f[i+1]; if( a[i]!=b[i] ) f[i]++; } cout << "Case " << ++casenum << ": "; nowdis = 0;//目前(a距離-b距離)的 for(int i=1;i<=n;i++) { for(char w='a';w<='z';w++) { if( !isok(w,i) ) continue; printf("%c",w); if( w!=a[i] ) nowdis++; if( w!=b[i] ) nowdis--; break; } } cout << endl; } }