zoukankan      html  css  js  c++  java
  • 【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;
    }
  • 相关阅读:
    随机数
    ASP .NET下的301重定向如何做
    网站外部链接建设方案
    解析ASP.NET WebForm和Mvc开发的区别
    委托、匿名委托和lambda表达式
    图片垂直居中
    jquery函数写法
    [转]函数方法常用的动词
    CSS Hack
    富文本编辑器
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7626507.html
Copyright © 2011-2022 走看看