H. 封印之门(单向路,不知道脑子怎么了,直接就是双向路)
蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手。幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印。
封印之门上有一串文字,只包含小写字母,有 kkk 种操作规则,每个规则可以把一个字符变换成另外一个字符。经过任意多次操作以后,最后如果能把封印之门上的文字变换成解开封印之门的文字,封印之门将会开启。
蒜头君战斗力超强,但是不擅计算,请你帮忙蒜头君计算至少需要操作多少次才能解开封印之门。
输入格式
输入第一行一个字符串,长度不大于 100010001000,只包含小写字母,表示封印之门上的文字。
输入第二行一个字符串,只包含小写字母,保证长度和第一个字符串相等,表示能解开封印之门的文字。
输入第三行一个整数 k(0≤k≤676)k(0 \le k \le 676)k(0≤k≤676)。
接下来 kkk 行,每行输出两个空格隔开的字符 aaa, bbb,表示一次操作能把字符 aaa 变换成字符 bbb。
输出格式
如果蒜头君能开启封印之门,输出最少的操作次数。否则输出一行 −1-1−1。
样例输入
abcd dddd 3 a b b c c d
样例输出
6
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>
#define bug(x) printf("%d****\n",x)
typedef long long ll;
using namespace std;
const int INF=0x3f3f3f3f;
map<char,int> mp;const int maxn=1010;
char s1[maxn],s2[maxn];
int cnt=0;
int head[maxn*2];
struct Edge{int v,nt;
}edge[maxn*2];
void add_edge(int u,int v){edge[cnt].nt=head[u];edge[cnt].v=v;head[u]=cnt++;
}struct Node{int x;int step;bool operator<(const Node& b)const{return step>b.step;//??}
}now,nxt;int vis[maxn*2],dis[maxn*2];
int get_min(int st,int ed){if(st==ed) return 0;memset(vis,0,sizeof(vis));memset(dis,INF,sizeof(dis));dis[st]=0;priority_queue<Node> q;now.x=st,now.step=0;q.push(now);while(!q.empty()){now=q.top();//printf("st:%d ed:%d now:%d s:%d\n",st,ed,now.x,now.step);q.pop();int x=now.x,sp=now.step;if(vis[x]) continue;vis[x]=1;if(x==ed) return sp;for(int i=head[x];i!=-1;i=edge[i].nt){int v=edge[i].v;if(dis[v]>dis[x]+1){dis[v]=dis[x]+1;nxt.x=v,nxt.step=sp+1;q.push(nxt); }}}return -1;
}int main(){int num=0;memset(head,-1,sizeof(head));scanf("%s",s1);scanf("%s",s2);int len=strlen(s1);for(int i=0;i<len;i++)if(!mp.count(s1[i])){mp[s1[i]]=num++;}for(int i=0;i<len;i++){if(!mp.count(s2[i]))mp[s2[i]]=num++;}
// printf("a:%d \n",mp['a']);int k;scanf("%d",&k);for(int i=1;i<=k;i++){char a,b;scanf(" %c %c",&a,&b);if(a==b) continue;if(!mp.count(a))mp[a]=num++;if(!mp.count(b))mp[b]=num++; add_edge(mp[a],mp[b]);}int ans=0,wrong=0;for(int i=0;i<len;i++){int tmp=get_min(mp[s1[i]],mp[s2[i]]);if(tmp==-1){wrong=1;break;}ans+=tmp;} if(wrong)printf("-1\n");elseprintf("%d\n",ans);return 0;
}
H. 封印之门(单向路,不知道脑子怎么了,直接就是双向路)相关推荐
- 2018 蓝桥杯省赛 B 组模拟赛(一)H.封印之门 最短路
蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印. 封印之门上有一串文字,只包含小写字母, ...
- 2018 蓝桥杯省赛 B 组模拟赛(一)--- H. 封印之门(最短路)
题目描述 蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印. 封印之门上有一串文字,只包含 ...
- 计蒜客2018 蓝桥杯省赛 B 组模拟赛(一)-H题封印之门
蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印. 封印之门上有一串文字,只包含小写字母, ...
- 2018 蓝桥杯省赛 B 组模拟赛(一) 封印之门+最短路径之Floyd
题目: 蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印. 封印之门上有一串文字,只包含小 ...
- 蓝桥杯--封印之门( Floyd算法)
蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有 一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印.封印之门上有一串 文字,只包含小写字母 ...
- 计蒜客-封印之门【floyd】
蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印. 封印之门上有一串文字,只包含小写字母, ...
- 计蒜客-封印之门(简单Floyd应用)
蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印. 封印之门上有一串文字,只包含小写字母, ...
- 计蒜客 封印之门(最短路,floyd)
封印之门 蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有一扇上古之神打造的封印之门,可以通往近卫军团,传闻至今没有人能解除封印. 封印之门上有一串文字,只包含 ...
- 2018 蓝桥杯省赛 B 组模拟赛(一)--封印之门
题目链接:https://nanti.jisuanke.com/t/A1594 蒜头君被暗黑军团包围在一座岛上,所有通往近卫军团的路都有暗黑军团把手.幸运的是,小岛上有一扇上古之神打造的封印之门,可以 ...
最新文章
- 第八节 字符串的插入
- (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)
- HihoCoder - 1465 后缀自动机五·重复旋律8(后缀自动机)
- 1岁确诊脑瘫,“轮椅博士”,毕业了!
- java打印等腰梯形
- ora-01489 字符串连接的结果过长 解决方案
- jquery 后代元素_在jQuery中查找元素的所有后代
- 用ssh反向隧道访问内网机器
- html+css基础-2-盒子模型、选择器优先级、新增伪元素、display:none
- Python打造一款属于自己的翻译词典
- MySQL查询某一天数据
- TypeScript基础入门之Symbols
- 机器学习(三):如何理解最大似然估计MLE与最大后验估计MAP
- 【UVA 815 --- Flooded!】
- EF 通用帮助类 含分页 Lambda 拼接表达式
- 电子招投标系统源码之了解电子招标投标全流程
- 学习Java未来就业前景和方向如何?
- cpp c++编写代码块 有颜色 好看些
- WPF工控组态软件之管道和冷却风扇开发
- linux挂载移动硬盘乱码