Rotation Matching CodeForces - 1365C(计算偏移量)

题意:给你俩个大小为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;
}

猜你喜欢

转载自blog.csdn.net/Alanrookie/article/details/107576348
今日推荐