首页 > 其他 > 详细

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

时间:2018-07-31 01:08:38      阅读:175      评论:0      收藏:0      [点我收藏+]

题目

题意是给了两个字符串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

 

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

原文:https://www.cnblogs.com/shuaihui520/p/9393587.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!