String Problem(模板)【最短路】
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(模板)【最短路】的更多相关文章
- HDOJ3374 String Problem 【KMP】+【最小表示法】
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hdu String Problem(最小表示法入门题)
hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...
- HDU 3374 String Problem(KMP+最大/最小表示)
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- 【HDU3374】 String Problem (最小最大表示法+KMP)
String Problem Description Give you a string with length N, you can generate N strings by left shift ...
- HDU 3374 String Problem (KMP+最大最小表示)
HDU 3374 String Problem (KMP+最大最小表示) String Problem Time Limit: 2000/1000 MS (Java/Others) Memory ...
- String Problem hdu 3374 最小表示法加KMP的next数组
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- ACM-ICPC2018南京赛区 Mediocre String Problem
Mediocre String Problem 题解: 很容易想到将第一个串反过来,然后对于s串的每个位置可以求出t的前缀和它匹配了多少个(EXKMP 或者 二分+hash). 然后剩下的就是要处理以 ...
- hdu3374 String Problem【最小表示法】【exKMP】
String Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- hdu 5772 String problem 最大权闭合子图
String problem 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5772 Description This is a simple pro ...
随机推荐
- Word使用技巧——持续更新
Q1:word 2007 打开后默认显示缩略图而不是文档结构图? A1:三步曲 1)打开word,关闭缩略图,保存并关闭文档 2)重新打开word(此时应该没有显示缩略图),勾选上“文档结构图”,保存 ...
- mysql 赋权语句
grant all privileges on phplampDB.* to phplamp@localhost identified by '1234';
- 人机协同与AI能力训练
我们进行<中台战略>一书的第三期分享. “人机融合是解决aI机器人冷启动的绝佳解决方案,我们这里引入了一个应答满意度的指标,每一个咨询应答都对应一个应答满意度.当消费者应该回答选择转入人工 ...
- 设计并测试Trapezium类 代码参考
#include <iostream> using namespace std; class Trapezium { private: int x1,y1,x2,y2,x3,y3,x4,y ...
- windows下nodejs的安装
1.下载 从nodejs官网下载地址:http://www.nodejs.org 2.安装 双击node-v4.4.0-x64.msi或者其他版本 3.环境搭建 进入cmd命令窗口 进入到nodejs ...
- Netty源码学习系列之1-NioEventLoopGroup的初始化
前言 NioEventLoopGroup是netty对Reactor线程组这个抽象概念的具体实现,其内部维护了一个EventExecutor数组,而NioEventLoop就是EventExecuto ...
- Rocket - tilelink - Bundles
https://mp.weixin.qq.com/s/jrqBg2AIpQogBrpwNXjmwg 简单介绍Bundles文件中对TileLink规范(1.7.1)的定义. 参考链接:https: ...
- 【大厂面试02期】Redis过期key是怎么样清理的?
PS:本文已收录到1.1K Star数开源学习指南--<大厂面试指北>,如果想要了解更多大厂面试相关的内容,了解更多可以看 http://notfound9.github.io/inter ...
- Multiple annotations found at this line:- The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
解决办法: 右键所在项目 build path configure build path java build path Add Library server Run time (Apache Tom ...
- Java实现 LeetCode 827 最大人工岛(DFS+暴力模拟)
827. 最大人工岛 在二维地图上, 0代表海洋, 1代表陆地,我们最多只能将一格 0 海洋变成 1变成陆地. 进行填海之后,地图上最大的岛屿面积是多少?(上.下.左.右四个方向相连的 1 可形成岛屿 ...