首页 > 代码库 > Educational Codeforces Round 25 D - Suitable Replacement(贪心)

Educational Codeforces Round 25 D - Suitable Replacement(贪心)

 题目大意:给你字符串s,和t,字符串s中的‘?‘可以用字符串t中的字符代替,要求使得最后得到的字符串s(可以将s中的字符位置两两交换,任意位置任意次数)中含有的子串t最多。

解题思路: 因为知道s中的字符位置可以交换无数次,所以只要s中含有可以组成t的字符就一定可以出现子串t。所以就是要令t中的字符数量尽量平均地分布在s中。

代码:

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 int str[300];
 5 
 6 int main(){
 7     string s,t;
 8     cin>>s>>t;
 9     for(int i=0;i<s.size();i++){
10         if(s[i]!=?)
11             str[s[i]-a]++;
12     }
13     int k=0;
14     int d=t.size();
15     for(int i=0;i<s.size();i++){    
16         if(s[i]==?){
17             k++;
18             k%=d;
19             //说明这个字符出现次数比较多,把机会让给出现次数较少的字符 
20             if(str[t[k]-a]>0){
21                 str[t[k]-a]--;
22                 i--;
23             }
24             else
25                 s[i]=t[k];
26         }
27     }
28     cout<<s<<endl;
29     return 0;
30 }

 

Educational Codeforces Round 25 D - Suitable Replacement(贪心)