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;
    }
    
原文地址:https://www.cnblogs.com/lr599909928/p/13043072.html