[CF1383A]String Transformation 1
题目
传送门 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相关推荐
- 【做题】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)\)表示字符串 ...
- CodeForces - 946C String Transformation
赛后上网一搜题解题意理解错了,一直wa 题意:给你一个字符串,长度n<=1e5,你要把其中的的某些字母换成大于等于它的任意一个字母(例如a可以换成b到z,不换也可以),使最终这个序列中从开始到最 ...
- Java和.NET使用DES对称加密的区别
Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...
- java之php、Android、JAVA、C# 3DES加密解密
异常如下 1.javax.crypto.BadPaddingException: Given final block not properly padded 1)要确认下是否加密和解密都是使用相同的填 ...
- 用集合java字符串第一个单词_Java小程序 输入一个字符串,将每一个单词首字母大写...
Java 小程序 01 输入一个字符串,将每一个单词首字母大写 1.首先写一个接收传入的单词,并将传入单词首字母大写.这一步比较简单,没什么好说的! private String titleCase ...
- [Java 安全]加密算法
Base64编码 算法简述 定义 Base64内容传送编码是一种以任意8位字节序列组合的描述形式,这种形式不易被人直接识别. Base64是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的A ...
- python vs java的rsa加密
首先:java的加密解密模块需要更加精细的算法细节指定 java的加密方式 javax.crypto.Cipher,定义的获取方式 tatic Cipher getInstance(String tr ...
- reactor官方文档译文(2)Reactor-core模块
You should never do your asynchronous work alone. - Jon Brisbin 完成Reactor 1后写到 You should never do y ...
- JAVA 上加密算法的实现用例---转载
通常 , 使用的加密算法 比较简便高效 , 密钥简短,加解密速度快,破译极其困难.本文介绍了 MD5/SHA1,DSA,DESede/DES,Diffie-Hellman 的使用. 第 1 章基础知识 ...
最新文章
- 统计学原理-----概率分布
- Redis总结(五)缓存雪崩和缓存穿透等问题
- 数据结构实验之链表三:链表的逆置
- release8_如何在Windows 8 Release Preview中将Chrome用作Metro浏览器
- [react] 同时引用这三个库react.js、react-dom.js和babel.js它们都有什么作用?
- 计算机组成原理节拍分为几种,计算机组成原理习题答案第七章
- android rxjava2 简书,RXJava2学习
- Spring Boot基础学习笔记05:Spring Boot多环境配置
- Power BI Embedded 开发国内版-21V-版本实测
- php百度地图地址解析失败,javascript - vue中使用百度地图 提示无法解析
- 如何判断一个类是无用的类?
- mysql questions_sql_mysql
- Tracert原理图解
- 图书销售系统系统设计说明书
- 住得越高越安静? 中间楼层噪音最大
- 在拼多多上抢了点茅台
- 养生“六伤”、“十二莫”、“十二少”
- 【回忆杀】2012年拥有第一台电脑【致逝去的青春】
- touchdesigner音频可视化
- long到int、int到long的强制类型转换的汇编代码