Gym 102823H Hamming Distance ###K //K
题目链接:https://codeforc.es/gym/102823/problem/H
题意:给定两个字符串 每个字符串与另一个字符串的距离为 其中的不同字符数
要找一个字典序最小的字符串 使得和s1和s2的距离一样
思路:直接从前到后枚举 每个位置a~z 选哪个, 贪心前面能选最小的就选这样一定最优
同时预处理一个后缀有多少个不同的字符 如果是两个字符当前位相同肯定是放a
当前能修改的尽量修改小 同时要满足后面的不同字符要大于当前已修改过的字符
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 }

浙公网安备 33010602011771号