显然做完操作$2$后再做操作$1$。

建立一个$26$个点的有向图,每个点只有一条出边,$i$->$j$表示$i$最终变成了$j$,边权为一开始是$i$,最后不是$j$的位置个数,如果$i\neq j$,则代价还要增加$c$。

对于每个点贪心选取最小的出边,如果没有环,那么此时就是最优解。

否则,对于一个连通块,如果它是环,那么需要多付出$c$点代价,而且如果所有连通块都是环或者孤立点,则不可能构造出这种图。

考虑重新决定每个点的出边,如果出现了原来贪心构造出的图中不存在的环,那么一定有一个点的出边和一开始不同,因为一开始是贪心选最小,因此把那条边改回最开始的出边,答案不会增加,而且新环被破坏了。因此对于不是原来中的图的环,一定存在一种方案与它代价相同,且不存在这个环。

于是设$f[i][S][j]$表示考虑了前$i$个字符,$S$集合的环已经被破坏,是否和原图一样为$j$时边权的最小值,DP即可。

因为最多只有$13$个环,所以时间复杂度为$O(n+26^2\times2^{13})$。

  1. #include<cstdio>
  2. const int N=26,M=1000010,inf=~0U>>1;
  3. int n,c,m,flag,i,j,k,S,U,v[N][N],ap[N],w[N][N],g[N],fa[N],d[N],vis[N],del[N],id[N];
  4. int f[N+1][1<<(N/2)][2],ans;char a[M],b[M];
  5. int F(int x){return fa[x]==x?x:fa[x]=F(fa[x]);}
  6. inline void up(int&a,int b){if(a>b)a=b;}
  7. int main(){
  8. scanf("%d%d%s%s",&n,&c,a,b);
  9. for(i=0;i<n;i++)v[a[i]-'a'][b[i]-'a']++,ap[a[i]-'a']++;
  10. for(i=0;i<N;i++)for(j=0;j<N;j++){
  11. w[i][j]=ap[i]-v[i][j];
  12. if(i!=j)w[i][j]+=c;
  13. }
  14. for(i=0;i<N;i++)fa[i]=i,id[i]=-1;
  15. for(i=0;i<N;i++){
  16. for(k=j=0;j<N;j++)if(w[i][j]<w[i][k])k=j;
  17. d[g[i]=k]++;
  18. if(F(i)!=F(k))fa[fa[i]]=fa[k];
  19. }
  20. for(i=0;i<N;i++)if(!del[F(i)]){
  21. del[fa[i]]=vis[i]=1;
  22. for(j=g[i];!vis[j];j=g[j])vis[j]=1;
  23. if(g[j]==j)continue;
  24. for(id[j]=m,k=g[j];k!=j;k=g[k])id[k]=m;
  25. m++;
  26. }
  27. if(!m){
  28. for(i=0;i<N;i++)ans+=w[i][g[i]];
  29. return printf("%d",ans),0;
  30. }
  31. for(flag=1,i=0;i<N;i++)if(d[i]!=1)flag=0;
  32. for(i=0;i<=N;i++)for(S=0;S<1<<m;S++)for(j=0;j<2;j++)f[i][S][j]=inf;
  33. f[0][0][0]=0;
  34. for(i=0;i<N;i++)for(S=0;S<1<<m;S++)for(j=0;j<2;j++)if(f[i][S][j]<inf)for(k=0;k<N;k++){
  35. U=S;
  36. if(~id[i]&&k!=g[i])U|=1<<id[i];
  37. if(~id[k]&&(k!=g[i]||id[i]!=id[k]))U|=1<<id[k];
  38. up(f[i+1][U][j||k!=g[i]],f[i][S][j]+w[i][k]);
  39. }
  40. for(ans=inf,S=0;S<1<<m;S++)for(j=flag;j<2;j++)if(f[N][S][j]<inf)up(ans,f[N][S][j]+(m-__builtin_popcount(S))*c);
  41. return printf("%d",ans),0;
  42. }

  

BZOJ4607 : [PA2015 Final]Edycja的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. java抽象、接口 和final

    抽象 一.抽象类:不知道是具体什么东西的类. abstract class 类名 1.抽象类不能直接new出来. 2.抽象类可以没有抽象方法. public abstract class USB { ...

  3. Java内部类final语义实现

    本文描述在java内部类中,经常会引用外部类的变量信息.但是这些变量信息是如何传递给内部类的,在表面上并没有相应的线索.本文从字节码层描述在内部类中是如何实现这些语义的. 本地临时变量 基本类型 fi ...

  4. Java关键字final、static

    一.final根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类.非抽象类成员方法和变量.你可能出于两种理解而需要阻止改变:设计或效率. final ...

  5. JavaSE 之 final 初探

    我们先看一道面试题: 请问 final 的含义是什么?可以用在哪里?其初始化的方式有哪些? 首先我们回答一下这道题,然后再探究其所以然.  1.final 表示“最终的”.“不可改变的”,意指其修饰类 ...

  6. PHP的final关键字、static关键字、const关键字

    在PHP5中新增加了final关键字,它可以加载类或类中方法前.但不能使用final标识成员属性,虽然final有常量的意思,但在php中定义常量是使用define()函数来完成的. final关键字 ...

  7. final修饰符

    final本身的含义是"最终的,不可变的",它可以修饰非抽象类,非抽象方法和变量.注意:构造方法不能使用final修饰,因为构造方法不能被继承,肯定是最终的. final修饰的类: ...

  8. 浅析Java中的final关键字(转载)

    自http://www.cnblogs.com/dolphin0520/p/3736238.html转载 一.final关键字的基本用法 在Java中,final关键字可以用来修饰类.方法和变量(包括 ...

  9. java关键字extends(继承)、Supe(父类引用空间)、 This(方法调用者对象)、Instanceof(实例类型-判断对象是否属于某个类)、final(最终)、abstract(抽象) 、interface(接口)0

    java 继承使用关键字extends   继承的作用:减少代码量,优化代码 继承的使用注意点: 1子类不能继承父类的私有变量 2.子类不能继承父类的构造方法 3.子类在调用自己的构造方法时 会默认调 ...

随机推荐

  1. CodeForces 282C(位运算)

    C. XOR and OR time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  2. NYOJ之Fibonacci数

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAskAAAJwCAIAAAD0kmsHAAAgAElEQVR4nO3dvXLbOMM24O8k3PtA3E

  3. 在ubuntu上搭建开发环境7---ubuntu安装JDK

    首先,当然是要下载了. 地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html 按 ...

  4. Delphi操作XML简介

    参考:http://www.delphifans.com/InfoView/Article_850.html Delphi 7支持对XML文档的操作,可以通过 TXMLDocument类来实现对XML ...

  5. Counterfeit Dollar -----判断12枚钱币中的一个假币

     Counterfeit Dollar Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u ...

  6. makefile示例

    1. 生成.so动态库 示例一: SoVer = 10010110CfgVer = 10010110 BinName = fnights.soGameName = "\"fnigh ...

  7. 初识SQL Server Integration Service

    SSIS(SQL Server Integration Service)是Microsoft 从SQL Server2005 以后发布的,现在一直跟随每个SQL server版本.它是Microsof ...

  8. Linux重置root密码步骤

    1.开机时任意按一个方向键,进入界面,选择linux系统,按e键进入2.然后用上下键选择kerner(内核)那一行,按e键进入编辑界面,编辑界面最后一行显示如下:(grub edit> kern ...

  9. ZEALER背后的乐视云视频

    ZEALER是我非常喜欢的一个测评网站,经常访问看看手机.电动牙刷及机械键盘的测试视频,非常欣赏王自如的数据化测评理念.敬畏之心,以及不祛痘的视频. 刚好最近对网络视频应用比较感兴趣,觉得ZEALER ...

  10. VPS -Digital Ocean -搭建一个最简单的web服务器

    简单的也是美的 在一个目录放自己的几个showcase网页方便和别人分享,最简单的方式是什么 创建文件夹,放入自己的网页文件 在目录下执行 $ nohup python -m SimpleHTTPSe ...