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 一个喳喳的做法的更多相关文章

  1. Codeforces 903E Swapping Characters

    题目大意 考虑一个未知的长为 $n$($2\le n\le 5000$)由小写英文字母构成的字符串 $s$ .给出 $k$($1\le k\le 2500$,$nk\le 5000$)个字符串 $s_ ...

  2. Swapping Characters CodeForces - 903E (字符串模拟)

    大意: 给定k个字符串, 长度均为n, 求是否存在一个串S, 使得k个字符串都可以由S恰好交换两个字符得到. 暴力枚举交换的两个字符的位置, 计算出交换后与其他串不同字符的个数, 若为1或>2显 ...

  3. Find The Multiple (poj1426 一个好的做法)

    Find The Multiple Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16505   Accepted: 673 ...

  4. 「TJOI / HEOI2016」求和 的一个优秀线性做法

    我们把\(S(i, j)j!\)看成是把\(i\)个球每次选择一些球(不能为空)扔掉,选\(j\)次后把所有球都扔掉的情况数(顺序有关).因此\(S(i, j)j! = i![x^i](e^x - 1 ...

  5. jQuery插件开发精品教程,让你的jQuery提升一个台阶

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  6. iOS----自定义UIView,绘制一个UIView

    绘制一个UIVIew最灵活的方式就是由它自己完成绘制.实际上你不是绘制一个UIView,你只是子类化了UIView并赋予子类绘制自己的能力.当一个UIVIew需要执行绘图操作的时,drawRect:方 ...

  7. 转:jQuery插件开发精品教程,让你的jQuery提升一个台阶

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  8. 【转载】jQuery插件开发精品教程,让你的jQuery提升一个台阶

    要说jQuery 最成功的地方,我认为是它的可扩展性吸引了众多开发者为其开发插件,从而建立起了一个生态系统.这好比大公司们争相做平台一样,得平台者得天下.苹果,微软,谷歌等巨头,都有各自的平台及生态圈 ...

  9. C 实现一个简易的Http服务器

    引言 做一个老实人挺好的,至少还觉得自己挺老实的. 再分享一首 自己喜欢的诗人的一首 情景诗. 每个人总会有问题,至少喜欢就好, 本文 参照 http 协议   http://www.cnblogs. ...

随机推荐

  1. oracle date 和 timestamp区别

    在今天的工作中,学到了以下几个知识点: 一.date和timestamp 的区别 date类型是Oracle常用的日期型变量,他的时间间隔是秒.两个日期型相减得到是两个时间的间隔,注意单位是“天”.例 ...

  2. Cadence如何自定义快捷键

    第一步:将pcbenv复制到SPB_Data下,并覆盖原来的文件 第二步:打开pcbenv文件,将script和views文件夹以及env复制到cadence安装目录\SPB_16.3\share\p ...

  3. DefaultHttpClient 在oppo A57手机上网络请求报错

    使用的库是xutils2.6.14,oppo A57 上调试的时候,请求接口时报错,但是其他手机都正常: com.lidroid.xutils.exception.HttpException: jav ...

  4. .net core webapi +ddd(领域驱动)+nlog配置+swagger配置 学习笔记(1)

    搭建一个.net core webapi项目  在开始之前,请先安装最新版本的VS2017,以及最新的.net core 2.1. 首先创建一个Asp.Net Core Web应用程序 这个应用程序是 ...

  5. UINavigationController + UIScrollView组合,视图尺寸的设置探秘(一)

    UINavigationController和UIScrollView是iOS下几种主要的交互元素,但当我搭配二者在一起时,UIScrollView的滚动区域出现了很诡异的现象.我希望UIScroll ...

  6. [hdu 2089] 不要62 数位dp|dfs 入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求[n, m]区间内不含4和62的数字个数. 这题有两种思路,直接数位dp和dfs 数位d ...

  7. Windows 下 Swoole开发环境配置

    一直停留在windows,入了 jetbrains 的全家桶.准备入门 Swoole,不可能每做一点修改就 git push 运行一下.因此要在 windows 上配置 swoole 运行环境.对比了 ...

  8. loj #2006. 「SCOI2015」小凸玩矩阵

    #2006. 「SCOI2015」小凸玩矩阵   题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...

  9. Html再学

    1.  Html是网页的载体.内容就是网页制作者放在页面上想要用户浏览的信息,可以包括文字.图片.视频等. 2.  CSS样式是展现.就像网页的外衣.比如,标题字体.颜色变化,或为标题加入背景图片.边 ...

  10. U19464 山村游历(Wander) LCT维护子树大小

    \(\color{#0066ff}{ 题目描述 }\) 在一个偏远的小镇上,有一些落后的山村.山村之间通过一些道路来连接.当然有的山村可能不连通. 一年当中会发生很多大事,比如说有人提议要在山村\(i ...