1. 程式人生 > 實用技巧 >Gym 102823H Hamming Distance

Gym 102823H Hamming Distance

題目連結:https://codeforc.es/gym/102823/problem/H

題意:給定兩個字串 每個字串與另一個字串的距離為 其中的不同字元數

要找一個字典序最小的字串 使得和s1和s2的距離一樣
思路:直接從前到後列舉 每個位置a~z 選哪個,同時預處理一個字尾有多少個不同的字元

當前能修改的儘量修改小 同時要滿足後面的不同字元要大於當前已修改過的字元

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int mod=1e4;
6 const int maxn=1e4+10; 7 int suf[maxn]; 8 9 10 int main() 11 { 12 ios::sync_with_stdio(0); 13 cin.tie(0); 14 int t; 15 cin>>t; 16 int cnt=0; 17 while(t--) 18 { 19 cout<<"Case "<<++cnt<<": "; 20 string s1,s2; 21 cin>>s1>>s2;
22 int n=s1.size(); 23 suf[n+1]=0; 24 for(int i=n;i>=1;i--) 25 { 26 suf[i]=suf[i+1]; 27 if(s1[i-1]!=s2[i-1]) 28 { 29 suf[i]++; 30 } 31 } 32 int now=0; 33 string ans; 34 for
(int i=1;i<=n;i++) 35 { 36 if(s1[i-1]==s2[i-1]) 37 { 38 ans+='a'; 39 } 40 else 41 { 42 for(char j='a';j<='z';j++) 43 { 44 int temp=now; 45 if(s1[i-1]==j) 46 { 47 temp++; 48 } 49 else if(s2[i-1]==j) 50 { 51 temp--; 52 } 53 if(abs(temp)<=suf[i+1]) 54 { 55 ans+=j; 56 now=temp; 57 break; 58 } 59 } 60 } 61 } 62 cout<<ans<<'\n'; 63 64 } 65 66 67 68 }
View Code