题意:给一个 n 个数的数组 aa ,和一个 nn 个数的数组 bb ,对 bb 进行若干次循环右移,使得对应位置和 aa 中元素相等的元素个数最多,求最多有多少种元素。
题解:每次将一个数转到对应位置都需要转动固定的次数,用一个数组记录在这个次数下有多少个字母可以对齐,最后取这个数组的最大值即可。
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
#include <algorithm>
using namespace std;
const int maxn=1e6+5;
int a[maxn],b[maxn],num[maxn];
int main(){
map<int,int>pos;
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
pos[a[i]]=i;
}
int ans=0;
for(int i=1;i<=n;i++){
cin>>b[i];
int poss=i-pos[b[i]]+1;
if(poss<=0)poss+=n;
num[poss]++;
ans=max(ans,num[poss]);
}
cout<<ans<<endl;
}