题意:给你一个串,仅含有a~g,且每个字母只出现最多一次。和一个光标初始位置,以及一个目标串,问你最少要多少的代价变化成目标串。

有五种操作:在光标前添加一个未出现过的字母,代价1。

删除光标前或者光标后的字母,代价1。

光标左移或者右移,代价0.5。

哈希,把串弄成一个八进制数,加上一个光标位置,状态数不超过8^8。

直接跑dijkstra即可。

要注意初始化的时候,可以单独记一个数组,表示用过的状态,仅仅重置这些状态,防止初始化复杂度过高。

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
char s1[10],s2[10];
int pp,len1,len2,d[17000000],pw[10];
bool vis[17000000],cant[8];
int st[17000000],En;
struct Node{int u,d;Node(const int &u,const int &d){this->u=u;this->d=d;}Node(){}
};
bool operator < (const Node &a,const Node &b){return a.d>b.d;
}
priority_queue<Node>Heap;
int main(){
//  freopen("j.in","r",stdin);memset(d,0x7f,sizeof(d));pw[0]=1;for(int i=1;i<=8;++i){pw[i]=pw[i-1]*8;}while(scanf("%s%d%s",s1,&pp,s2)!=EOF){memset(cant,0,sizeof(cant));bool flag=1;while(!Heap.empty()){Heap.pop();}En=0;int U=0,len1=strlen(s1),len2=strlen(s2);for(int i=0;i<len2;++i){if(cant[s2[i]-'a'+1]){flag=0;break;}cant[s2[i]-'a'+1]=1;}if(!flag){puts("-1");continue;}for(int i=0;i<len1;++i){U=U*8+s1[i]-'a'+1;}U=U*8+pp;int goal=0;for(int i=0;i<len2;++i){goal=goal*8+s2[i]-'a'+1;}Heap.push(Node(U,0));d[U]=0;st[++En]=U;while(!Heap.empty()){Node now=Heap.top(); Heap.pop();if(!vis[now.u]){if(now.u/8==goal){break;}vis[now.u]=1;int U=now.u;int len=0;int gbp=U%8; U/=8;memset(cant,0,sizeof(cant));
//              char S[10];while(U){cant[U%8]=1;
//                  S[len++]=U%8+'a'-1;++len;U/=8;}
//              for(int i=0;i<len;++i){
//                  putchar(S[i]);
//              }
//              puts("");//plusif(len<7){U=now.u;U-=(U%pw[len-gbp+1]);U*=8;U+=(now.u%pw[len-gbp+1]);for(int i=1;i<=7;++i){if(!cant[i]){int tU=U+i*pw[len-gbp+1];++tU;if(d[tU]>d[now.u]+2){d[tU]=d[now.u]+2;Heap.push(Node(tU,d[tU]));st[++En]=tU;}}}}//deleteif(len>0){if(gbp>0){U=now.u%pw[len-gbp+1];int tmp=now.u;tmp/=pw[len-gbp+2];tmp*=pw[len-gbp+1];U+=tmp;--U;if(d[U]>d[now.u]+2){d[U]=d[now.u]+2;Heap.push(Node(U,d[U]));st[++En]=U;}}if(gbp<len){U=now.u%pw[len-gbp];int tmp=now.u;tmp/=pw[len-gbp+1];tmp*=pw[len-gbp];U+=tmp;if(d[U]>d[now.u]+2){d[U]=d[now.u]+2;Heap.push(Node(U,d[U]));st[++En]=U;}}}//moveif(gbp>0){if(d[now.u-1]>d[now.u]+1){d[now.u-1]=d[now.u]+1;Heap.push(Node(now.u-1,d[now.u-1]));st[++En]=now.u-1;}}if(gbp<len){if(d[now.u+1]>d[now.u]+1){d[now.u+1]=d[now.u]+1;Heap.push(Node(now.u+1,d[now.u+1]));st[++En]=now.u+1;}}}}printf("%.1f\n",(double)(*min_element(d+goal*8,d+goal*8+8))*0.5);for(int i=1;i<=En;++i){d[st[i]]=2000000000;vis[st[i]]=0;}}return 0;
}

转载于:https://www.cnblogs.com/autsky-jadek/p/7583421.html

【最短路】【Heap-dijkstra】hihocoder 1587 ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 J. Typist's Problem...相关推荐

  1. hihoCoder 1578 Visiting Peking University 【贪心】 (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)...

    #1578 : Visiting Peking University 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Ming is going to travel for ...

  2. 【Java/补题/牛客/ACM赛制】2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛(正式赛)

    文章目录 题目链接 知识一览 题目列表 快输 C - GCD(数论分块) 题目链接 2021年ICPC国际大学生程序设计竞赛暨陕西省第九届大学生程序设计竞赛(正式赛) 知识一览 01-数论分块 题目列 ...

  3. 计算机信息科学亚洲赛区冠军,祝贺竺院学子在ACM国际大学生程序设计竞赛亚洲赛区获得冠军...

    原标题:祝贺竺院学子在ACM国际大学生程序设计竞赛亚洲赛区获得冠军 Write the code. Change the World. 热烈祝贺竺可桢学院求是科学班(计算机)1601 陈靖邦.叶梓成, ...

  4. 2018ACM-ICPC国际大学生程序设计竞赛亚洲区域赛(青岛站)赛后总结

    这是今年最后一次打铁,我已经打了一年的铁了. 还是想写一个总结,不然,什么都会没留下. 实际上在去青岛之前,我已经一个月都没有严格地训练自己了,从9月份CCPC秦皇岛站打铁之后,我就基本上开始怀疑自己 ...

  5. 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(沈阳)

    有时候,很简单的模板题,可能有人没有做出来,(特指 I ),到时候一定要把所有的题目全部看一遍 文章目录 B 题解 E F 题解 H I 题解&代码 J B 输入样例 3 2 1 2 1 2 ...

  6. 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(上海)(热身赛(A/B) + 正式赛(D/E))

    热身赛 A. 虽然计算几何学了和没学差不多,但是板子题还是要会的(火速去补) 一定能形成折线,所以选最长的两个删掉就可以了 struct node {double dist;int x; };int ...

  7. 第 46 届 ICPC 国际大学生程序设计竞赛亚洲区域赛(上海)DEGHI

    D Strange_Fractions 令t=b/a,可以得到关于t的一元二次方程,用根的存在定理以及根是否为整数判断是否存在解,若有解,用求根方式求出t来,取t=(p+sqrt(p^2 -4q^2) ...

  8. ICPC 2019国际大学生程序设计竞赛,中国高校未能夺冠

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」,购票请扫码咨询 ↑↑↑ 整理 | 琥珀 出品 | AI科技大本营(ID:rgznai100) 一年一度的国际大学生程序设计竞赛(Int ...

  9. ACM国际大学生程序设计竞赛

    ACM国际大学生程序设计竞赛(英文全称:ACM International Collegiate Programming Contest(简称ACM-ICPC或ICPC))是由国际计算机协会(ACM) ...

最新文章

  1. SAP SD之如何配置发票分割开票
  2. java反序列化 exp_java反序列化-ysoserial-调试分析总结篇(4)
  3. (Mac-使用问题)Mac升级到 10.12后,下载的一些安装包提示损坏。
  4. 模拟电路技术之基础知识(六)
  5. lwip之数据收发流程_2
  6. Process和ProcessBuilder入门【原】
  7. 使用Identity Server 4建立Authorization Server (1)
  8. 从程序员到项目经理(15):项目管理三大目标
  9. linux搭建python运行环境_centos运行.py centos5.5下搭建python开发运行环境 - Linux - 服务器之家...
  10. html 文字如何和阴影齐平,求助!Html Div齐平无效
  11. CFree注册码及破解过程【转】
  12. PKUWC2019 总结
  13. Alibaba Cloud Linux 搭建Frp内网穿透服务(兼容Centos)
  14. 你这么真诚,一定是骗子!
  15. 自己开发iOS版按键精灵--TTouch
  16. python 三维曲线拟合_python实现三维拟合的方法
  17. win7命令更新补丁
  18. SteamVR 2.x 手柄使用3D物体(14)
  19. break与continue的区别
  20. 【开源】这可能是封装微信 API 最全的 .NET SDK 了

热门文章

  1. 构建一个简单的go-web镜像
  2. 徐凌云老师--沪师经纪
  3. C++《面向对象程序设计课程设计》
  4. vcruntime140_1.dll丢失的解决办法
  5. 离线预渲染OPR:0成本接入 媲美SSR效果
  6. 浅谈金达莱花在朝鲜族家居装饰中的传承发展
  7. HDFS--机架感知
  8. 斐讯T1/N1 Linux 更换中文系统环境和界面
  9. 场地测量的方法和程序_(完整版)场地平整施工测量
  10. 合资车忧“芯”忡忡,多款车型宣布停产,自主品牌的机会来了?