description:
-
给定两个长度为 的 的排列 。
-
你可以对任意一个排列进行若干次长度为 的 循环右移或左移;这里的循环移动指每个元素依次向左或右移动 个,如果移出边界的元素再折回到排列的头或尾。
-
你需要求出在移动过后最多有多少个对应的位置使得 。
-
,。
-
translate by @ShineEternal。
solution:
我们直接在众多种移动方法中保留任意一种其实就行了。
我们对于 中的每个元素,记录其与对应的 中相等的元素所相差的距离,众数即为答案。
code:
#include<cstdio>
using namespace std;
int abs(int x)
{
if(x<0)return -x;
return x;
}
int max(int x,int y)
{
if(x>y)return x;
return y;
}
int a[200005],b[200005],dis[200005],mp0[200005],mp[200005];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
mp0[a[i]]=i;
}
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
mp[b[i]]=i;
}
for(int i=1;i<=n;i++)
{
dis[(n+mp0[i]-mp[i])%n]++;
}
int ans=0;
for(int i=1;i<=n;i++)
{
ans=max(ans,dis[i]);
}
if(n==1)printf("1\n");
else
printf("%d\n",ans);
return 0;
}