E. Swapping Characters 一个喳喳的做法
http://codeforces.com/contest/903/problem/E
题意是,对于每个字符串都要交换两个位置的字符(id),使得结果所有字符串是一样的,输出那个字符串。
正解是,先比较两个字符串,如果他们不同的位置 > 4那就是不行的了
有4个不同的还是可行的,比如:
abab
baba
因为每个字符串都有一次交换机会,所以可以变成
baab即可
如果小于4,那么暴力枚举每一个不同的位置,和任意一个位置交换,暴力check,复杂度5000^2
我的渣渣做法。
因为n*k<5000
预处理每一个字符串,所有交换情况后得到字符串的hash值,知道原串的hash值,交换两个字符后,得到的hash值可以O(1)搞出来
然后相当于给k个数组,问是否存在一个数字在这k个数组中都存在过。
复杂度n^2 log n
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
using namespace std;
#define inf (0x3f3f3f3f)
typedef long long int LL;
const int maxn = + ;
char str[maxn][maxn];
unsigned long long int po[maxn];
const int seed = ;
int cnt[maxn], DFN;
struct Node {
unsigned long long int val;
int one, two;
Node(unsigned long long int _val, int _one, int _two) {
val = _val, one = _one, two = _two;
}
bool operator < (const struct Node & rhs) const {
return val < rhs.val;
}
};
vector<Node> vc[maxn];
void work() {
int k, n;
scanf("%d%d", &k, &n);
for (int i = ; i <= k; ++i) scanf("%s", str[i] + ); if (k == ) {
swap(str[][], str[][]);
printf("%s\n", str[] + );
printf("\n");
return;
}
for (int i = ; i <= k; ++i) {
unsigned long long int now = ;
bool can = false;
DFN++;
for (int j = ; j <= n; ++j) {
now = now * seed + str[i][j];
can |= cnt[str[i][j]] == DFN;
cnt[str[i][j]] = DFN;
}
if (can) vc[i].push_back(Node(now, , ));
for (int j = ; j <= n; ++j) {
for (int f = j + ; f <= n; ++f) {
if (str[i][j] == str[i][f]) {
if (can) continue;
can = true;
}
unsigned long long int ha = now - str[i][j] * po[n - j] - str[i][f] * po[n - f] + str[i][f] * po[n - j] + str[i][j] * po[n - f];
vc[i].push_back(Node(ha, j, f));
// swap(str[i][j], str[i][f]);
// cout << str[i] + 1 << " " << ha << endl;
// swap(str[i][j], str[i][f]);
}
}
// cout << endl;
sort(vc[i].begin(), vc[i].end());
}
// for (int i = 1; i <= k; ++i) {
// for (int j = 0; j < vc[i].size(); ++j) {
// cout << vc[i][j].val << " ";
// }
// cout << endl;
// }
for (int i = ; i < vc[].size(); ++i) {
int t = ;
for (int j = ; j <= k; ++j) {
if (vc[][i].val > vc[j].back().val) break;
int pos = lower_bound(vc[j].begin(), vc[j].end(), vc[][i]) - vc[j].begin();
if (vc[j][pos].val != vc[][i].val) break;
t++;
}
if (t == k) {
int id1 = vc[][i].one, id2 = vc[][i].two;
swap(str[][id1], str[][id2]);
printf("%s\n", str[] + );
return;
}
}
printf("-1\n");
} int main() {
#ifdef local
freopen("data.txt", "r", stdin);
// freopen("data.txt", "w", stdout);
#endif
po[] = ;
for (int i = ; i <= maxn - ; ++i) po[i] = po[i - ] * seed;
work();
return ;
}
E. Swapping Characters 一个喳喳的做法的更多相关文章
- Codeforces 903E Swapping Characters
题目大意 考虑一个未知的长为 $n$($2\le n\le 5000$)由小写英文字母构成的字符串 $s$ .给出 $k$($1\le k\le 2500$,$nk\le 5000$)个字符串 $s_ ...
- Swapping Characters CodeForces - 903E (字符串模拟)
大意: 给定k个字符串, 长度均为n, 求是否存在一个串S, 使得k个字符串都可以由S恰好交换两个字符得到. 暴力枚举交换的两个字符的位置, 计算出交换后与其他串不同字符的个数, 若为1或>2显 ...
- Find The Multiple (poj1426 一个好的做法)
Find The Multiple Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 16505 Accepted: 673 ...
- 「TJOI / HEOI2016」求和 的一个优秀线性做法
我们把\(S(i, j)j!\)看成是把\(i\)个球每次选择一些球(不能为空)扔掉,选\(j\)次后把所有球都扔掉的情况数(顺序有关).因此\(S(i, j)j! = i
本人就是小白,昨天在使用listview时,看到说有更好的控件出来了,在V7包中,需要SDK21及以上,那就试着用用吧,今天试了一天,终于弄的能简单使用了,分享一下. 怎么导入这个recycleyvi ...
- JavaScript知识体系索引
JavaScript 参考手册 www.w3school.com.cn JavaScript基础语法 JavaScript的数据类型 Javascript的对象分类 JavaScript内置对象 Ja ...
- jmeter测试报告汉化及脚本编写
在做接口自动化时,生成的测试报告页面是英文的,如现在我们优化成汉文.操作如下: 1,下载汉化包 下载路径:https://i.cnblogs.com/Files.aspx?order=1 2,解压汉化 ...
- D3.js 之 d3-shap 简介(转)
[转] D3.js 之 d3-shap 简介 译者注 原文: 来自 D3.js 作者 Mike Bostock 的 Introducing d3-shape 译者: ssthouse 联系译者: 邮箱 ...
- Unity苹果(iOS)内购接入(Unity内置IAP)
https://www.jianshu.com/p/4045ebf81a1c Unity苹果(iOS)内购接入(Unity内置IAP) Kakarottog ...
- PerformCallback
实现客户端,服务端异步通信的. 从客户端到服务端的通信:PerformCallback().PerformCallback就是从客户端到服务端的桥梁,它是单向的只能从客户端发起到服务端.在Perfor ...
- 《图解HTTP》阅读笔记--第七章---确保WEB安全的HTTPS
第七章.确保WEB安全的HTTPSHTTP的缺点:通信使用明文(不加密),内容可能会被窃听 解决---加密处理: //将通信加密 :通过SSL(安全套接层)---HTTPS(超文本传输安全协议)--- ...
- js 弹性菜单
<!doctype html> <html> <head> <meta http-equiv="Content-Type" content ...
- [ZJOI2014]力(FFT)
[Luogu3338] [BZOJ5327] (DarkBZOJ数据有问题) \(19.3.8\) 前置知识:[知乎-如何通俗易懂地解释卷积] [FFT详解] \(1.\)卷积定义 我们称 \((f* ...