D. Two Strings Swaps(分类)

    技术2022-07-14  74

    交换的条件是很苛刻的

    只允许a的对称字母换,b的对称字母换,a和b的对应位置换

    那 么 a i 、 a n − i + 1 、 b i 、 b n − i + 1 是 一 个 整 体 那么a_i、a_{n-i+1}、b_i、b_{n-i+1}是一个整体 aiani+1bibni+1

    其 他 位 置 的 字 母 不 会 换 到 这 个 集 合 中 来 , 这 个 集 合 却 可 以 彼 此 交 换 其他位置的字母不会换到这个集合中来,这个集合却可以彼此交换 ,

    到 了 这 里 确 实 非 常 简 单 了 , 但 是 别 以 为 已 经 做 完 了 ! ! \color{Red}到了这里确实非常简单了,但是别以为已经做完了!! ,!!

    如何正确的考虑这个集合要修改的次数也是个问题

    这里解释的不错

    #include <bits/stdc++.h> using namespace std; const int maxn=2e5+10; int n,ans; char a[maxn],b[maxn]; int main() { cin >> n >> (a+1) >> (b+1); for(int i=1;i<=n/2;i++) { char q=min(a[i],a[n-i+1]),w=max(a[i],a[n-i+1]); char sq=min(b[i],b[n-i+1]),sw=max(b[i],b[n-i+1]); if(sq==q&&sw==w) continue; else if(q==w&&sw==sq) continue;//以上是完全相同的情况 else if(sq==q||sq==w||sw==q||sw==w) ans++;//有1个相同 else if(sq==sw) ans++;//只需要换a的1个字母 else ans+=2; } if( n%2==1 && a[n/2+1]!=b[n/2+1] ) ans++; cout<<ans; }
    Processed: 0.009, SQL: 10