题意:给你俩个大小为n的排列,现在你可以任意的选择一个排列,使其全部元素同时向右或者向左平移k(k任选)个单位,问最多能有多少个:当i == j(俩个排列中的位置下标一样时),ai == bj(相同位置的元素值相同)。

题解:左移与右移其实时一样的,我们将每一个字母移动到对应位置需要的偏移量时固定的,若多个字母的偏移量相同,则说明这是同一次操作的结果,这样用map对每一次的偏移量加1(代表这个偏移量下又有一个字符可以对应),最后记录这个过程中的最大值就行了。

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;
}