【codeforces 527B】Error Correct System

【题目链接】:http://codeforces.com/contest/527/problem/B

【题意】

给你两个字符串;
允许你交换一个字符串的两个字符一次;
问你这两个字符串最少会有多少个位置上的字符不同

【题解】

考虑一次交换能够造成的结果
->不同的字符个数减少1
->不同的字符个数减少2
先考虑减少1
记录第一个字符串哪些字符和第二个字符串的不一样记录下来
然后扫描第二个字符串的每个字符,找到不同字符的位置,看看第二个字符串那个位置的字符有没有在第一个字符串里面出现过(刚才有记录的);
如果有的话,就说明能找到不同字符个数减少1的情况;
然后再考虑减少2的情况;
直接扫描一遍字符
如果s1[i]!=s2[i];
则a[s1[i]][s2[i]]=i
然后两层for循环i,j
如果a[i][j]&&a[j][i];
则交换a[i][j]和a[j][i]的字符,就能减少2了;

【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define ps push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%lld",&x)
#define ref(x) scanf("%lf",&x)

typedef pair<int, int> pii;
typedef pair<LL, LL> pll;

const int dx[9] = { 0,1,-1,0,0,-1,-1,1,1 };
const int dy[9] = { 0,0,0,-1,1,-1,1,-1,1 };
const double pi = acos(-1.0);
const int N = 256;
const int L = 2e5 + 100;

int a[256][256],n,v[256],l=-1,r=-1,sub,ans = 0;
char s[L], t[L];

int main()
{
    //freopen("F:\rush.txt", "r", stdin);
    rei(n);
    scanf("%s", s + 1);
    scanf("%s", t + 1);
    rep1(i, 1, n)
        if (s[i]!=t[i])
        {
            ans++;
            v[s[i]] = i;
            a[s[i]][t[i]] = i;
        }
    rep1(i,1,n)
        if (t[i] != s[i])
        {
            if (v[t[i]])
            {
                l = v[t[i]], r = i;
                sub = 1;
                break;
            }
        }
    for (char i = 'a';i <= 'z';i++)
        for (char j = 'a';j <='z';j++)
            if (a[i][j] && a[j][i])
            {
                l = a[i][j], r = a[j][i];
                sub = 2;
                break;
            }
    ans -= sub;
    printf("%d
", ans);
    printf("%d %d
", l, r);
    //printf("
%.2lf sec 
", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626507.html