Codeforces 903E Swapping Characters
题目大意
考虑一个未知的长为 $n$($2\le n\le 5000$)由小写英文字母构成的字符串 $s$ 。给出 $k$($1\le k\le 2500$,$nk\le 5000$)个字符串 $s_1, s_2, \dots, s_k$,$s_i$ 由 $s$ 通过交换 $s[x_i]$ 和 $s[y_i]$($x_i \ne y_i$ )得到。求 $s$,若有多解输出任意一个接,无解输出 -1
。
解法
假设输入的 $k$ 个串不全相等。(否则平凡)
取 $s_1$、$s_2$,$s_1\ne s_2$ 。(此 $s_1, s_2$ 并非指输入的 $s_1, s_2$ 。)
设 $i$ 是两者不相同的第一个位置,则二者中至少有一个的「交换位置」包含 $i$ 。
据此,可以先假设 $s_1$ 的一个交换位置是 $i$ ,枚举 $s_1$ 的另一个交换位置,进行检验。
若不可能,再假设 $s_2$ 的一个交换位置是 $i$ ,枚举 $s_2$ 的另一个交换位置。
这种做法的时间复杂度为 $O(kn + n^{2}k)$,可接受。
TODO
能否进一步缩小可能的交换位置的范围(candidate swapping index pair),下面尝试讨论这一问题。
不失一般性,设 $s_1$ 的交换位置为 $(i, j)$,$s_2$ 的交换位置为 $(i', j')$ 。
分类讨论:
- $i$ 不是 $s_1$ 的第一个交换位置,即 $j < i$ 。
1.1 $s_1[i] = s_1[j]$
1.2 $s_1[i] \ne s_1[j]$ - $i$ 是 $s_1$ 的第一个交换位置,即 $j > i$ 。
Codeforces 903E Swapping Characters的更多相关文章
- Swapping Characters CodeForces - 903E (字符串模拟)
大意: 给定k个字符串, 长度均为n, 求是否存在一个串S, 使得k个字符串都可以由S恰好交换两个字符得到. 暴力枚举交换的两个字符的位置, 计算出交换后与其他串不同字符的个数, 若为1或>2显 ...
- E. Swapping Characters 一个喳喳的做法
http://codeforces.com/contest/903/problem/E 题意是,对于每个字符串都要交换两个位置的字符(id),使得结果所有字符串是一样的,输出那个字符串. 正解是,先比 ...
- Codeforces 1513F - Swapping Problem(分类讨论+乱搞)
Codeforces 题目传送门 & 洛谷题目传送门 简单题,难度 *2500 的 D2F,就当调节一下一模炸裂了的自闭的心情,稍微写写吧. 首先我看到这题的第一反应是分类讨论+数据结构,即枚 ...
- Codeforces Round #484 (Div. 2) B. Bus of Characters(STL+贪心)982B
原博主:https://blog.csdn.net/amovement/article/details/80358962 B. Bus of Characters time limit per tes ...
- Codeforces Round #590 (Div. 3) D. Distinct Characters Queries(线段树, 位运算)
链接: https://codeforces.com/contest/1234/problem/D 题意: You are given a string s consisting of lowerca ...
- codeforces 982B Bus of Characters
题意: 有n排座位,每排有两个座位,每排座位的宽度都不一样. 有2 * n个人要上车,如果是内向的人,那么它会选择一排两个都是空位并且宽度最小的一排去坐: 如果是外向的人,会选择一排座位已经有人坐的, ...
- Codeforces 982 B. Bus of Characters(模拟一个栈)
解题思路: 排序之后模拟一个栈(也可以用真的栈),时间复杂度o(n). 代码: #include <bits/stdc++.h> using namespace std; typedef ...
- Codeforces Round #590 D. Distinct Characters Queries
CF上给的标签是数据结构.但给的题解里的方法是很巧的暴力,用vector<set>维护每个字母出现的下标,每次修改加下标,擦下标.每次询问对每个字母分别lower_bound查找区间内是否 ...
- CodeForces 527B Error Correct System
Error Correct System Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I6 ...
随机推荐
- ProtoBuff3 unity_TCP网络发包解包&&消息订阅
using Google.Protobuf; //using Google.Protobuf.Examples.AddPerson; using Google.Protobuf.WellKnownTy ...
- UVA11090 Going in Cycle (二分+判负环)
二分法+spfa判负环.如果存在一个环sum(wi)<k*x,i=0,1,2...,k,那么每条边减去x以后会形成负环.因此可用spfa来判负环. 一般spfa判负环dfs最快,用stack次之 ...
- pycharm 使用技巧
格式化代码为pep8: ctrl+alt+l http://edu.51cto.com//index.php?do=lession&id=163794
- 洛谷 P3601 签到题
https://www.luogu.org/problemnew/show/P3601 一道关于欧拉函数的题. 读完题目以后我们知道所谓的$aindao(x)=x- \phi (x) $. 对于x小的 ...
- [LUOGU] P2634 [国家集训队]聪聪可可
点分治裸题,甚至不需要栈回撤. 尝试用容斥写了一波,就是把所有子树混一块计算,最后减去子树内路径条数. #include<iostream> #include<cstring> ...
- 【Python学习之五】高级特性4(切片、迭代、列表生成器、生成器、迭代器)
4.生成器(generator) 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的 ...
- 线段树、前缀数组:HDU1591-Color the ball(区间更新、简单题)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- Linux操作系统启动流程
一般来说,所有的操作系统的启动流程基本就是: 总的来说,linux系统启动流程可以简单总结为以下几步:1)开机BIOS自检,加载硬盘.2)读取MBR,进行MBR引导.3)grub引导菜单(Boot L ...
- IDEA字体颜色快速导入辅助工具设置
原创链接:https://www.cnblogs.com/ka-bu-qi-nuo/p/9181954.html 程序员开发大多数都是使用IDE进行代码开发的,这样能快速的开发出需要的项目.之前一直 ...
- dotnet core 运行程序注意事项
.net core 程序 debug版本无法直接运行,因为没有相关的dll,只有在进入项目文件夹那一层,执行 dotnet run 来运行,会自动链接 当前用户的个人文件夹下的 .nuget/.pac ...