题意:
给定两个排列,问能否通过左移右移操作将a序列和b序列相同数在同一位置的数量最多。左移右移操作定义为:对于序列c: 左移操作为将所有数循环地向左移动一个位置,即变为:c1:=c2,c2:=c3,…,cn:=c1。右移类似。
思路:
因为是排列,所以每个数出现且只出现一次,那么对于b排列中的任意一个数x,记录下x在a排列中的位置,即是要将b中的x与a对齐所需要的操作次数。记录下每一个操作次数所能够对齐的数量,取max即是答案。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#include<sstream>
#include<set>
#include<bitset>
#include<vector>
#include<cmath>
using namespace std;
int dx[]={-1,0,1,0,0},dy[]={0,1,0,-1,0};
typedef pair<int,int> PII;
typedef long long LL;
const int INF=0x3f3f3f3f;
const int N=2e5+10;
int a[N],b[N],pos[N];
int cnt[N];
int n;
int main()
{
cin>>n;
for(int i=0;i<n;i++) cin>>a[i],pos[a[i]]=i;
for(int i=0;i<n;i++) cin>>b[i];
for(int i=0;i<n;i++)
{
int cur=pos[b[i]]-i;
if(cur < 0) cur+=n;
cnt[cur]++;
}
cout<<*max_element(cnt,cnt+n+1)<<endl;
//system("pause");
}