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


    • 题意:给你两个长度相同的字符串\(a\)\(b\),你可以将相同位置上的\(a\)\(b\)的字符交换,也可以将\(a\)\(b\)中某个位置和对应的回文位置上的字符交换,这些操作是不统计的,你可以将\(a\)的某个字符替换,操作数+1,然后可以执行上文的操作,问最少操作多少次,使得\(a\)\(b\)相等.

    • 题解:我们只对\(a_{i},a_{n-i+1},b_{i},b_{n-i-1}\)进行判断,如果这\(4\)个数各不相同,那么就需要修改2个\(a\),如果有\(3\)个不相同,分两个\(a\)是否相同来讨论,如果有\(2\)个不相同,分\(1+3\)\(2+2\)来讨论即可.

    • 代码:

      #include <iostream>
      #include <cstdio>
      #include <cstring>
      #include <cmath>
      #include <algorithm>
      #include <stack>
      #include <queue>
      #include <vector>
      #include <map>
      #include <set>
      #include <unordered_set>
      #include <unordered_map>
      #define ll long long
      #define fi first
      #define se second
      #define pb push_back
      #define me memset
      const int N = 1e6 + 10;
      const int mod = 1e9 + 7;
      const int INF = 0x3f3f3f3f;
      using namespace std;
      typedef pair<int,int> PII;
      typedef pair<ll,ll> PLL;
       
      int n;
      string a,b;
      map<int,int> mp;
      int main() {
          ios::sync_with_stdio(false);cin.tie(0);
      	cin>>n>>a>>b;
      	int cnt=0;
      	for(int i=0;i<n/2;++i){
      		mp.clear();
      		mp[a[i]]++;mp[a[n-i-1]]++;
      		mp[b[i]]++;mp[b[n-i-1]]++;
      		if(mp.size()==4) cnt+=2;
      		else if(mp.size()==3){
      			if(a[i]==a[n-i-1]) cnt+=2;
      			else cnt++;
      		}
      		else{
      			if(mp[a[i]]==3||mp[b[i]]==3) cnt++;
      		}
      	}
      	if(n&1){
      		if(a[n/2]!=b[n/2]) cnt++;
      	}
      	printf("%d\n",cnt);
       
          return 0;
      }
      
  • 相关阅读:
    【扫盲】模块 库 框架 包
    AJax和JQ的结合使用
    AJax的三种响应
    使用session存储数据
    Requset作用域
    Cookie实现记住密码代码
    Cookie技术
    请求转发和重定向
    重定向的两次请求分别是????
    servlet
  • 原文地址:https://www.cnblogs.com/lr599909928/p/13043072.html
Copyright © 2020-2023  润新知