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 }
View Code

 

posted @ 2020-12-06 21:15  canwinfor  阅读(217)  评论(0)    收藏  举报