zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    RocketMQ之二:分布式开放消息系统RocketMQ的原理与实践(消息的顺序问题、重复问题、可靠消息/事务消息)
    Redis 发布/订阅机制原理分析
    Guava 12-数学运算
    Guava] 11
    Guava 10-散列
    Guava 9-I/O
    Guava 8-区间
    mat(Eclipse Memory Analyzer tool)之二--heap dump分析
    Python流程控制语句
    监控和管理Cassandra
  • 原文地址:https://www.cnblogs.com/shuaihui520/p/9393587.html
Copyright © 2011-2022 走看看