• Codeforces Round#498(Div.3)D. Two Strings Swaps


    题目

    题意是给了两个字符串a和b,然后可以对这两个字符串有三种操作来使这两个字符串相等,一是交换a[i]和b[i],二是交换a[i]和a[n-i+1],三是交换b[i]和b[n-i+1],这三个操作都是不计步数的,然后问最少还需要多少步可以让a串等于b串。

    分析:我们可以想到我们只要关心a[i],a[n-i+1],b[i],b[n-i+1],这四个数即可,只要他们是构成两队相等的对字符,我们就可以通过交换变成是相等的字符串,所以我们遍历一遍

    分类讨论:

    • 一组字符中存在两对相等字符的情况则不需要替换操作

    • 一组字符中上面两个与下面两个至少存在一对相等字符的情况,那么只需要修改上面的一个就能获得两对相等字符了

    • 一组字符中上面两个与下面两个完全不同:若下面两个字符相等,那么上面只需要修改一个就能获得两对相等字符;否则上面就得修改两个字符才能获得两对字符(因为我们是改变才交换,而且是只能改变ai字符串)

    最后判断串长是否为奇数,是的话判断上下中间字符是否相等,不相等就需要修改上面的

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    int len;
    string a,b;
    
    int main()
    {
      cin>>len>>a>>b;
      int ans = 0;
      for(int i=0;i<len/2;i++){
        int l = i, r = len - i - 1;
        if(a[l] == b[l] && a[r] == b[r] || a[l] == b[r] && a[r] == b[l] || a[l] == a[r] && b[l] == b[r])
          continue;
        else if(a[l] == b[l] || a[r] == b[r] || a[l] == b[r] || a[r] == b[l] || b[l] == b[r])
          ans++;
        else
          ans += 2;
      }
      if(len % 2 == 1 && a[len/2] != b[len/2])ans++;
      cout<<ans<<endl;
      return 0;
    }
    View Code
  • 相关阅读:
    第一个WCF的程序
    第一节 SOA的基本概念和设计思想
    数组拷贝 copyOf()
    dict和set
    类的构造函数
    深入理解 Python 异步编程(上)
    Nifi自定义processor
    java inputstream to string stack overflow
    java inputstream to string
    oracle 导入 dmp
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/9393587.html
Copyright © 2020-2023  润新知