题目

传送门 to CF

思路

我佛了……搬题人翻译了个什么鬼话……

最初以为只能修改一段连续的相同字符,问题变为了一个矩形填充的问题。没有任何头绪,瞎想了很久。

终于又看题,发现题目中并没有说是连续的字符……可是翻译题面中说那是一支笔!难道一支笔不应该画过连续字符吗?是你没用过笔还是我没用过笔?

重新读了题。发现问题等价于,给出一个 DAG\rm DAGDAG,找到边数最小的 G′=(V,E′)G'=(V,E')G′=(V,E′) 使得 G′G'G′ 上传递闭包是原图传递闭包的超集。

然后随便胡了一个贪心上去:比如 aaa 要到达 b,cb,cb,c 两个点,那么显然 a→b→ca\rightarrow b\rightarrow ca→b→c 是最优选择。所有点都这样接出一条链,就行了!

也没多想这玩意儿是不是正确的。毕竟这场比赛是 3.5h3.5h3.5h 四道题,这才 T1T_1T1​ 就用了 1h1h1h 了,八嘎!于是就得到了四十五分的好成绩。

上面那个贪心有啥问题呢?就是假如现在 aaa 已经有后继节点了,又应该选谁呢?真是漏洞百出;稍微想想,就不会觉得它是正确的。

而在这个想法的基础上,再进一步就是正解。上面其实已经说明了一点:没有一个点的出度超过一。同理可知,没有点的入度超过一。所以新图全是链!

那么,所有在原图上有边相连的点,都必须在新图的同一条链中。换句话说,原图的每个弱连通块都对应新图的一条链。所以答案就是 ∣V∣−∣C∣|V|-|C|∣V∣−∣C∣,其中 ∣C∣|C|∣C∣ 是连通块个数。

时间复杂度 O(n+∣Σ∣)\mathcal O(n+|\Sigma|)O(n+∣Σ∣) 。

代码

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cctype>
using namespace std;
#define rep(i,a,b) for(int i=(a); i<=(b); ++i)
#define drep(i,a,b) for(int i=(a); i>=(b); --i)
typedef long long llong;
inline int readint(){int a = 0, c = getchar(), f = 1;for(; !isdigit(c); c=getchar())if(c == '-') f = -f;for(; isdigit(c); c=getchar())a = (a<<3)+(a<<1)+(c^48);return a*f;
}const int MAXN = 100005;
char a[MAXN], b[MAXN];unsigned int g[26];
int main(){for(int T=readint(); T; --T){int n = readint();scanf("%s %s",a+1,b+1);memset(g,0,26<<2);bool bad = false;rep(i,1,n){if(a[i] > b[i]){bad = true; break;}g[a[i]-'a'] |= (1u<<(b[i]-'a'));g[b[i]-'a'] |= (1u<<(a[i]-'a'));}if(bad){ puts("-1"); continue; }rep(k,0,25) rep(i,0,25) if(g[i]>>k&1)g[i] |= g[k]; // floyedint ans = 0, now = 0;for(int i=0; i!=26; ++i)if(!(now>>i&1) && g[i]){ans += __builtin_popcount(g[i])-1;now |= g[i]; // merge this}printf("%d\n",ans);}return 0;
}

后记

这件事给了我们一个很深刻的教训:不是所有人都脑子没病,知道怎么说人话;把题读清楚,否则慌乱之中错误频发!

[CF1383A]String Transformation 1相关推荐

  1. 【做题】CF119D. String Transformation——KMP

    题意:有两个字符串\(a,b\),下标从\(0\)开始.求数对\((i,j)\)满足\(a[i+1:j] + r(a[j:n]) + r(a[0:i+1]) = b\),其中\(r(s)\)表示字符串 ...

  2. CodeForces - 946C String Transformation

    赛后上网一搜题解题意理解错了,一直wa 题意:给你一个字符串,长度n<=1e5,你要把其中的的某些字母换成大于等于它的任意一个字母(例如a可以换成b到z,不换也可以),使最终这个序列中从开始到最 ...

  3. Java和.NET使用DES对称加密的区别

    Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...

  4. java之php、Android、JAVA、C# 3DES加密解密

    异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...

  5. 用集合java字符串第一个单词_Java小程序 输入一个字符串,将每一个单词首字母大写...

    Java 小程序 01 输入一个字符串,将每一个单词首字母大写 1.首先写一个接收传入的单词,并将传入单词首字母大写.这一步比较简单,没什么好说的! private String titleCase ...

  6. [Java 安全]加密算法

    Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别. Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的A ...

  7. python vs java的rsa加密

    首先:java的加密解密模块需要更加精细的算法细节指定 java的加密方式 javax.crypto.Cipher,定义的获取方式 tatic Cipher getInstance(String tr ...

  8. reactor官方文档译文(2)Reactor-core模块

    You should never do your asynchronous work alone. - Jon Brisbin 完成Reactor 1后写到 You should never do y ...

  9. JAVA 上加密算法的实现用例---转载

    通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难.本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman 的使用. 第 1 章基础知识 ...

最新文章

  1. 统计学原理-----概率分布
  2. Redis总结(五)缓存雪崩和缓存穿透等问题
  3. 数据结构实验之链表三:链表的逆置
  4. release8_如何在Windows 8 Release Preview中将Chrome用作Metro浏览器
  5. [react] 同时引用这三个库react.js、react-dom.js和babel.js它们都有什么作用?
  6. 计算机组成原理节拍分为几种,计算机组成原理习题答案第七章
  7. android rxjava2 简书,RXJava2学习
  8. Spring Boot基础学习笔记05:Spring Boot多环境配置
  9. Power BI Embedded 开发国内版-21V-版本实测
  10. php百度地图地址解析失败,javascript - vue中使用百度地图 提示无法解析
  11. 如何判断一个类是无用的类?
  12. mysql questions_sql_mysql
  13. Tracert原理图解
  14. 图书销售系统系统设计说明书
  15. 住得越高越安静? 中间楼层噪音最大
  16. 在拼多多上抢了点茅台
  17. 养生“六伤”、“十二莫”、“十二少”
  18. 【回忆杀】2012年拥有第一台电脑【致逝去的青春】
  19. touchdesigner音频可视化
  20. long到int、int到long的强制类型转换的汇编代码

热门文章

  1. 图形推理题 答案揭晓
  2. win10/win7文件夹或文件查看方式怎么统一设置
  3. 谷歌浏览器播放视频只有声音没有画面解决方法
  4. Springboot - retry机制简介以及踩过的坑
  5. RDD.repartition
  6. 51--可调频率和占空比的PWM波
  7. 国产数据库mysql_国产的数据库都有哪些?
  8. SAP FI 系列 (031) - 允许在会计凭证中修改统驭科目
  9. RF在智能座舱测试中的应用
  10. 新版股票api接口大全