思路: 预处理最短路 然后每个不同字符选两个串变成变成相同字母的最短路径 如果有a->b b->c则可以a->c因为可以无限次数都换
#include<bits/stdc++.h>
using namespace std;
char s1[1000010];
char s2[1000010];
int hua[30][30];
int main()
{
int n;
while(cin>>s1>>s2>>n)
{
int ok=1;
int len1=strlen(s1);
int len2=strlen(s2);
if(len1!=len2)
{
ok=0;
}
for(int i=0; i<28; i++)
{
for(int j=0; j<28; j++)
{
hua[i][j]=1000;
}
}
for(int i=0; i<n; i++)
{
char c1,c2;
cin>>c1>>c2;
int temp;
cin>>temp;
hua[c1-'a'][c2-'a']=min(temp, hua[c1-'a'][c2-'a']);
}
for(int i=0;i<28;i++)hua[i][i]=0;
for(int k=0;k<28;k++)
for(int i=0;i<28;i++)
for(int j=0;j<28;j++)
if(hua[i][j]>hua[i][k]+hua[k][j])hua[i][j]=hua[i][k]+hua[k][j];
int sum=0;
if(ok){
for(int i=0;i<len1;i++){
if(s1[i]!=s2[i]){
int id;
int temp=2000;
for(int j=0;j<26;j++){
if(hua[s1[i]-'a'][j]!=1000&&hua[s2[i]-'a'][j]!=1000&&temp>hua[s1[i]-'a'][j]+hua[s2[i]-'a'][j]){
id=j;
temp=hua[s1[i]-'a'][j]+hua[s2[i]-'a'][j];
\
}
}
if(temp==2000){
ok=0;break;
}
sum+=temp;
s1[i]=s2[i]=id+'a';
}
}
}
if(ok)cout<<sum<<endl<<s1<<endl;
else cout<<-1<<endl;
}
}