您的位置:首页 > 其它

codeforce 527B

2015-10-13 20:03 211 查看
Ford Prefect got a job as a web developer for a small company that makes towels. His current work task is to create a search engine for the website of the company. During the development process, he needs to write a subroutine for comparing strings S and T
of equal length to be "similar". After a brief search on the Internet, he learned about the Hamming distance between two strings S and T of the same length, which is defined as the number of positions in which S and T have different characters. For example,
the Hamming distance between words "permanent" and "pergament" is two, as these words differ in the fourth and sixth letters.

Moreover, as he was searching for information, he also noticed that modern search engines have powerful mechanisms to correct errors in the request to improve the quality of search. Ford doesn't know much about human beings, so he assumed that the most common
mistake in a request is swapping two arbitrary letters of the string (not necessarily adjacent). Now he wants to write a function that determines which two letters should be swapped in string S, so that the Hamming distance between a new string S and string
T would be as small as possible, or otherwise, determine that such a replacement cannot reduce the distance between the strings.

Help him do this!

Input

The first line contains integer n (1 ≤ n ≤ 200 000) — the length of strings S and T.

The second line contains string S.

The third line contains string T.

Each of the lines only contains lowercase Latin letters.

Output

In the first line, print number x — the minimum possible Hamming distance between strings S and T if you swap at most one pair of letters in S.

In the second line, either print the indexes i and j (1 ≤ i, j ≤ n, i ≠ j), if reaching the minimum possible distance is possible by swapping letters on positions i and j, or print "-1 -1", if it is not necessary to swap characters.

If there are multiple possible answers, print any of them.

Sample test(s)

Input

9

pergament

permanent

Output

1

4 6

Input

6

wookie

cookie

Output

1

-1 -1

Input

4

petr

egor

Output

2

1 2

Input

6

double

bundle

Output

2

4 1

分析:

题目给出两个长度相同的字符串,可能存在几组对应位置的字母不同,将不同位置的字母通过对调有时候可以满足部分对应位置相同,问要达到对调后剩余不相同位置的最小数量是多少,输出对调后不能相同的位置坐标。

可以用字母表的顺序,开两个二维数组来存储两个串中对应位置不同的两个字符,最后再来一个两层for循环,查找可以互换的情况。如不存在这种情况,那就再来一次循环,找到换一个的情况。

代码如下:

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;

int main()
{
int n;
string s1,s2;
int f1[27][27],f2[27][27];
int dan[27];
scanf("%d%*c",&n);
cin>>s1>>s2;   //输入两个等长的字符串
int k=0;
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2));
memset(dan,0,sizeof(dan));
for(int i=0;i<n;i++)
{
if(s1[i]!=s2[i])
{
f1[s1[i]-97][s2[i]-97]=i+1;//如果对应位置的字符不相等,则个数加一
f2[s2[i]-97][s1[i]-97]=i+1;
k++;    //不相等字符的总个数
}
}
for(int i=0;i<27;i++)    //调换后两个对应位置都相同的情况
{
for(int j=0;j<27;j++)
{
if(f1[i][j]&&f2[i][j])
{
printf("%d\n%d %d\n",k-2,f1[i][j],f2[i][j]);
return 0;
}
else if(f1[i][j])
{
dan[i]=f1[i][j];
}
}
}
for(int i=0;i<27;i++)    //调换后两个对应位置只有一个相同的情况,此时用不相等字符总数减一,并输出两个不同的位置坐标
{
if(dan[i])
{
for(int j=0;j<27;j++)
{
if(f2[i][j])
{
printf("%d\n%d %d\n",k-1,dan[i],f2[i][j]);
return 0;
}
}
}
}
printf("%d\n-1 -1\n",k);    //调换后两个对应位置都不相同的情况
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: