H. Hamming Distance(貪心)
阿新 • • 發佈:2021-02-01
技術標籤:比較有意思的題(可以禍害學弟學妹的題)
構造一個字典序最小的字串使得到 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距離 a距離−b距離,最後 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;
}
}