传送门:关于我写题遇到偏移量这件事。
这是一道神奇的题, 题意是给你一个两个长度为n的排列a,和b,然后你需要对b排列向左转或者向右转,使得ai == bi 的数量最多,现在需要你旋转任意次数,并且求出ai == bi最多的数量是多少,我们先规定转时一律向左转,因为转过之后整个排列都发生了变化,我们假设每个元素i在b中对应的位置需要向左转 ki 次才可以与a中i的位置相等,然后我们可以求出b中所有元素对应的k,然后我们惊奇的发现,如果说两个元素对应的左转的k相同,那么他们就是在同一次旋转,所以我们可以统计相同偏移量中相等的最大的那个数,输出即可(真的很神奇QAQ);
题目:
ac代码:
#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
using namespace std;
const int N = 2e5 + 10;
typedef long long int LL ;
int main()
{
int n ;
cin >> n ;
map<int,int> mp;
int x;
for(int i = 1; i <= n ; i ++)
{
cin >> x;
mp[x] = i ;
}
int ans = 0 ;
map<int,int> jis;
for(int i = 1; i <= n ; i ++)
{
cin >> x;
x = mp[x];
if(x >= i)x = x - i ;
else if(x < i)x = x + n - i;
jis[x]++;
ans = max(jis[x],ans);
}
cout << ans <<endl;
}