String Problem

题目链接(点击)

Boy Valera likes strings. And even more he likes them, when they are identical. That's why in his spare time Valera plays the following game. He takes any two strings, consisting of lower case Latin letters, and tries to make them identical. According to the game rules, with each move Valera can change one arbitrary character Ai in one of the strings into arbitrary character Bi, but he has to pay for every move a particular sum of money, equal to Wi. He is allowed to make as many moves as he needs. Since Valera is a very economical boy and never wastes his money, he asked you, an experienced programmer, to help him answer the question: what minimum amount of money should Valera have to get identical strings.

Input

The first input line contains two initial non-empty strings s and t, consisting of lower case Latin letters. The length of each string doesn't exceed 105. The following line contains integer n (0 ≤ n ≤ 500) — amount of possible changings. Then follow n lines, each containing characters Ai and Bi (lower case Latin letters) and integer Wi (0 ≤ Wi ≤ 100), saying that it's allowed to change character Ai into character Bi in any of the strings and spend sum of money Wi.

Output

If the answer exists, output the answer to the problem, and the resulting string. Otherwise output -1 in the only line. If the answer is not unique, output any.

Examples

input

Copy

uayd
uxxd
3
a x 8
x y 13
d c 3

output

Copy

21
uxyd

input

Copy

a
b
3
a b 2
a b 3
b a 5

output

Copy

2
b

input

Copy

abc
ab
6
a b 4
a b 7
b a 8
c b 11
c a 3
a c 0

output

Copy

-1

思路:

·  开始看题目没看太仔细,没感觉是最短路,因为我只是考虑了上下两个字母之间转换:

a

b

a→b 或者是 b→a

没考虑到  a→c→d→e

b→e 这种情况

·  看懂以后就知道是模板题了,有一点不同的是:

要将字符转换为数字表示最短路,在判断a变为什么的时候要先将a到其余25个点的最短路存进二维数组 (其余字母同理),      下面是代码:

        for(int i=1;i<=26;i++){
diji(i);
for(int j=1;j<=26;j++){
if(i==j){
num[i][j]=0;
}
else{
num[i][j]=dis[j];
}
}
}

·  想知道a最终变成什么就要判断到其余各点距离的最小值:

如果minn==MAX 即表示该点无法通过条件转化成其他字母,要输出 -1

否则 sum+=minn

·  但要注意:

两次输入相同的字母关系要取最小的 进行 addnode(将两个点用链式前向星连起来)

AC代码:

#include<stdio.h>
#include<string.h>
const int MAX=1e5;
struct node{
int to;
int len;
int next;
}edge[MAX+5];
int ans;
int head[MAX+5];
void addnode(int u,int v,int w)
{
edge[ans].to=v;
edge[ans].len=w;
edge[ans].next=head[u];
head[u]=ans++;
}
void allbegin()
{
memset(head,-1,sizeof(head));
ans=0;
}
int vis[MAX+5],dis[MAX+5];
void diji(int s)
{
for(int i=1;i<=26;i++){
dis[i]=MAX;
vis[i]=0;
}
dis[s]=0;
while(1){
int k=-1,len=MAX;
for(int i=1;i<=26;i++){
if(!vis[i]&&len>dis[i]){
k=i;
len=dis[i];
}
}
if(k==-1){
break;
}
vis[k]=1;
for(int j=head[k];~j;j=edge[j].next){
int t=edge[j].to;
if(!vis[t]&&dis[t]>edge[j].len+dis[k]){
dis[t]=edge[j].len+dis[k];
}
}
}
} //上面是迪杰斯特拉模板
int main()
{
int num[55][55],n;
char a[MAX+5],b[MAX+5],c[MAX+5];
memset(num,-1,sizeof(num));
scanf("%s%s",a,b);
int la=strlen(a);
int lb=strlen(b);
scanf("%d",&n);
allbegin();
for(int i=1;i<=n;i++){
int w;
char u[5],v[5];
scanf("%s%s%d",u,v,&w);
int u1=u[0]-'a'+1;
int v1=v[0]-'a'+1;
if(num[u1][v1]==-1||num[u1][v1]>w){
addnode(u1,v1,w);
}
}
if(la!=lb){ //长度不等 直接输出-1
printf("-1\n");
}
else{ //将26个字母任意两点距离打表
for(int i=1;i<=26;i++){
diji(i);
for(int j=1;j<=26;j++){
if(i==j){
num[i][j]=0;
}
else{
num[i][j]=dis[j];
}
}
}
int sum=0;
for(int i=0;i<la;i++){
int a1=a[i]-'a'+1;
int b1=b[i]-'a'+1;
if(a1==b1){
c[i]=a[i];
}
else{ //暴力找出与两个字符 转换值之和最小的 字母(数字代表字母)
int minn=MAX;
for(int j=1;j<=26;j++){
if(num[a1][j]+num[b1][j]<minn){
c[i]='a'+j-1;
minn=num[a1][j]+num[b1][j];
}
}
if(minn==MAX){ //没有条件将其转换成其他值 结果任然是MAX 输出-1
printf("-1\n");
return 0;
}
else{
sum+=minn;
}
}
}
printf("%d\n",sum);
puts(c);
}
return 0;
}

String Problem(模板)【最短路】的更多相关文章

  1. HDOJ3374 String Problem 【KMP】+【最小表示法】

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  2. hdu String Problem(最小表示法入门题)

    hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...

  3. HDU 3374 String Problem(KMP+最大/最小表示)

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  4. 【HDU3374】 String Problem (最小最大表示法+KMP)

    String Problem Description Give you a string with length N, you can generate N strings by left shift ...

  5. HDU 3374 String Problem (KMP+最大最小表示)

    HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  6. String Problem hdu 3374 最小表示法加KMP的next数组

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  7. ACM-ICPC2018南京赛区 Mediocre String Problem

    Mediocre String Problem 题解: 很容易想到将第一个串反过来,然后对于s串的每个位置可以求出t的前缀和它匹配了多少个(EXKMP 或者 二分+hash). 然后剩下的就是要处理以 ...

  8. hdu3374 String Problem【最小表示法】【exKMP】

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. hdu 5772 String problem 最大权闭合子图

    String problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5772 Description This is a simple pro ...

随机推荐

  1. 关于Android的真机测试

    步骤: 1.开启手机USB调试 2.数据线连接手机和电脑 3.eclipse需要重启 4.在eclipse的run里面的runconfig...里面设置为启动时总是提醒开发者选择 具体事例: 我的手机 ...

  2. 架构设计 | 接口幂等性原则,防重复提交Token管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.幂等性概念 1.幂等简介 编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同.就是说,一次和多次请求某一个资源会产 ...

  3. 永久关闭windows更新步骤

    在搜索“web和windows”框中输入“服务” 在搜索结果中点击第一个,那个图标像齿轮的那个!如下图. 在打开的“服务”窗口中,我们找到windows update   找到”windows upd ...

  4. SQL查找大小为n的连续区间

    数据准备 create table sequence ( seq int not null primary key ); insert into values(3); insert into valu ...

  5. [PHP自动化-进阶]005.Snoopy采集框架介绍

    引言:Snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务. **官方网址:http://snoopy.sourceforge.net/** 简单一句话表达:& ...

  6. 读Pyqt4教程,带你入门Pyqt4 _011

    当我们想要改变或者增强已存在的窗口组件时,或者准备从零开始创建自定义窗口组件时,可以使用绘图.我们通过使用PyQt4工具包提供的绘图API来绘图. 绘图在 paintEvent() 方法中进行.绘制代 ...

  7. excel操作数据实用技能

    写代码写习惯了,在做数据预处理时也总是习惯性地用python.pandas来做处理,但其实有时候根本不需要写代码,用excel也能达到目的,甚至比写代码快很多,写代码要半天,excel只要几秒钟.下面 ...

  8. Rocket - util - GenericParameterizedBundle

    https://mp.weixin.qq.com/s/vf0PfjbxQ3Ywjk6tk85SfA   介绍GenericParameterizedBundle的实现.   ​​   1. 基本介绍 ...

  9. 个人记录HTML基础笔记

    无功能性标签 en strong 都表示强调,strong强调级更高 abbr 缩写 <abbr title="wangweiwang">w3c</annr> ...

  10. DOM对HTML元素的增删改操作和事件概念和事件监听

    DOM创建节点的方法: document.createElement(Tag),Tag必须是合法的HTML元素 DOM复制节点的方法: 节点cloneNode(boolean deep),当deep为 ...