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 ;
}

最新文章

  1. MVC Api 的跨项目路由
  2. Jekyll + Github 搭建属于你的静态博客
  3. Quartz2D
  4. hdoj 1729 Stone Games(SG函数)
  5. iOS学习笔记--OC系列(1)
  6. app间互相启动及传参数
  7. 超详细的 Linux CentOS yum 源的配置与使用【转发+新增】
  8. RBAC用户特别授权的思考
  9. window64位电脑如何通过VMware Workstation12.5.6安装苹果操作系统 macOS High Sierra 10.13
  10. Cache-control使用Cache-control:private学习笔记【转载】
  11. 无源码调试smali
  12. 不同安卓手机的 安卓版本不同,xpath元素也不同
  13. TZOJ 1911 A Plug for UNIX(最大流)
  14. signal.h中的宏定义SIG_DFL及SIG_IGN
  15. Excel2010如何合并列数据
  16. Javascript-闰年javascript的判断
  17. [转载]this 指向详细解析(箭头函数)
  18. sysbench 参数
  19. loadrunner--vugen录制脚本提示“无Internet访问。您可能无法录制并执行业务进程”
  20. ios 开发之 -- UILabel的text竖行显示

热门文章

  1. HTML5应用程序缓存Application Cache详解.RP
  2. Struts2返回JSON数据的具体应用范例
  3. LeetCode第70题:爬楼梯
  4. Arcgis android10.2测试版中android.view.InflateException
  5. 关于eclipse导入maven项目
  6. C#知识点总结系列:3、C#中Delegate和Event以及它们的区别
  7. Shell学习日记
  8. 关于AppiumDriver
  9. python 对三维CT数据缩放
  10. Unity 动画系统 Animation和Animator等常用类