Loading

题解:P16865 [GKS 2021 #H] Transform the String

暴力题。

题目大意

给出 \(T\) 组数据,对于每组数据,给出两个字符串 \(S\)\(F\),求至少进行多少次操作,可以使 \(S\) 中的每个字符都是 \(F\) 中的字符。

思路

可以先使用一个 bool 数组把 \(F\) 中的字符都记录下来。然后对于 \(S\) 中的每个字符,都计算它至少需要进行几次操作,然后求和即可。时间复杂度 \(\mathcal{O}(|F| \times T+52 \times|S| \times T)\),可以通过此题。

#include <bits/stdc++.h>
#define int long long
#define pii pair<int, int>
#define piii pair<pii, int>
#define pll pair<ll, ll>
#define plll pair<pll, ll>
#define pref static inline
#define fi first
#define se second
using namespace std;
const int MAXN=125;
int t;
string s,f;
bool flag[MAXN];
int cnt=0;
namespace heffo_hard{
    pref void solve(){
        int ans=0;
        cin>>s>>f;
        // cout<<(int)'z'<<endl;
        memset(flag,0,sizeof(flag));//记得清零
        for(int i=0;i<f.size();++i)flag[f[i]]=1;//标记
        for(int i=0;i<s.size();++i){//遍历每个字符
            if(flag[s[i]]){//这个字符不用改变
                continue;
            }else{
                int cal1=0x3f,cal2=0x3f;//初始化为极大值
                for(int j=0;j<26;++j){
                    char c=(s[i]-'a'+j)%26+'a';
                    if(flag[c]){
                        cal1=j;
                        break;
                    }
                }
                for(int j=0;j<26;++j){
                    char c=(s[i]-'a'-j+26)%26+'a';
                    if(flag[c]){
                        cal2=j;
                        break;
                    }
                }
                ans+=min(cal1,cal2);
            }
        }
        printf("Case #%d: %d\n",++cnt,ans);
    }
};

signed main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--){
        heffo_hard::solve();
    }
    return 0;
}
/*
*/

如果这篇题解对您有帮助,可以点个赞吗?
如果发现有错误的地方或者对题目还有什么疑问,欢迎指出。

posted @ 2026-06-13 22:59  heffo_hard  阅读(2)  评论(0)    收藏  举报