您的位置:首页 > 其它

【CodeForces】#296 Div 2 B(简单hash应用)

2015-03-18 17:08 489 查看
题目大意:两个字符串,每个位置不同的话,Hamming distance+1,最后问你最多交换一次的话Hamming
distance变为多少,是交换哪一对的结果。

思路:我是用hash记录下可以交换的那个位置,以及这个位置希望得到什么。

最后通过遍历26个字母,找出交换使得Hamming
distance-1或者-2的那一对,因为只交换一次,所以挺简单的。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAX 200050
struct pos
{
int i, j;
int cnt;
}p;
struct posx
{
int next;
int x;
int need;
}ha[MAX];
int head[200];
int cnt;
char str1[MAX];
char str2[MAX];
bool flag;
bool flag2;
void add(int l,int ne,int po)
{
for (int i = head[l]; i != -1; i = ha[i].next)
if (ha[i].need == ne)return;

ha[cnt].x = po;
ha[cnt].need = ne;
ha[cnt].next = head[l];
head[l] = cnt++;
}

void find(int l)
{
for (int i = head[l]; i != -1; i = ha[i].next)
{
if (head[ha[i].need] != -1)
{
for (int j = head[ha[i].need]; j != -1;j=ha[j].next)
if (!flag&&ha[j].need == l)
{
p.i = min(ha[i].x, ha[j].x);
p.j = max(ha[i].x, ha[j].x);
p.cnt = 2;
flag = true;
return;
}
else
{
if (!flag2)
{
p.i = min(ha[i].x, ha[j].x);
p.j = max(ha[i].x, ha[j].x);
p.cnt = 1;
flag2 = true;
break;
}
}
}
}
}

int main()
{
int n;
while (~scanf("%d%*c", &n))
{
gets(str1);
gets(str2);
cnt = 0;
p.i = -2;
p.j = -2;
p.cnt = 0;
int ans = 0;
memset(head, -1, sizeof(head));
flag = false;
flag2 = false;
for (int i = 0; i < n; i++)
{
if (str1[i] != str2[i])
{
ans++;
add(str1[i], str2[i], i);
}
}
for (int i = 'a'; i <= 'z'; i++)
{
if (flag)
break;
if (head[i]+1)
find(i);
}
ans -= p.cnt;
printf("%d\n%d %d\n", ans, p.i+1, p.j+1);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: