Codeforces Round #648 (Div. 2).C Rotation Matching

链接http://codeforces.com/contest/1365/problem/C

题目大意

给定两个数组,相对位置可以作环状运动,问按照相同下标的元素值相等的匹配方法,最大的匹配数是多少。

做法

由于每个元素 1到 n  只出现一次 且一定出现 。定义两个数组存两个数组每个元素的位置,再定义一个cnt数组记录位于两个数组中的每个元素的位置差(从左往右数)。之后找出相同距离的元素数量最多的差。得到答案

代码

#include<bits/stdc++.h>
using namespace std;
int a[200005];
int b[200005];
int cnt[200005];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        int k;
        cin>>k;
        a[k]=i;
    }
    for(int i=1;i<=n;i++){
        int k;
        cin>>k;
        b[k]=i;
    }
    for(int i=1;i<=n;i++){
        cnt[(n+a[i]-b[i])%n]++;
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        ans=max(ans,cnt[i]);
    }
    if(n==1){
        cout<<1;
    }
    else
    cout<<ans;
} 
rush!
原文地址:https://www.cnblogs.com/LH2000/p/13065079.html