题解:P16865 [GKS 2021 #H] Transform the String
题目大意
给你两个字符串
每次操作可以将字符串中的一个字母改为字母表中它的前一个或后一个字母,且字母表被视为循环的,即字母
问最少需要进行几次操作才能达到目标。
算法分析
对于字符串
注意到数据范围
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int mp[305];
int main(){
std::ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
int T,id=0;
cin>>T;
while(T--){
cout<<"Case #"<<++id<<": ";
for(char i='a';i<='z';i++){
mp[i]=0x3f;//初始值设为无限大
}
string s,f;
cin>>s>>f;
int n=s.size();
s=" "+s;
for(int i=0;i<f.size();i++){//枚举每一位
for(char j='a';j<='z';j++){//枚举每个字母
mp[j]=min(mp[j],min(abs(j-f[i]),26-abs(j-f[i])));//更新最小变化次数
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans+=mp[s[i]];//累和
}
cout<<ans<<'\n';
}
return 0;
}