C. Rotation Matching
题目
给一个元素互不相同的序列,给出两种它的排列,可以将任意一个向左或者向右偏移,求最大匹配元素个数。
扯淡
第一次看见和偏移有关的,懵逼了。
思路
可以先只看其中一个元素,可以得到偏移多长能和模板序列对上。
再看整个序列,偏移相同长度,匹配最多的就是所求,所以找偏移量中重复最多元素的个数就行
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
int main()
{
ios::sync_with_stdio();
int n;
cin>>n;
PII a[n+1],b[n+1];
for(int i=1;i<=n;i++)
{
cin>>a[i].first;
a[i].second=i;
}
for(int i=1;i<=n;i++)
{
cin>>b[i].first;
b[i].second=i;
}
sort(a+1,a+1+n);
sort(b+1,b+n+1);
int ans=0,cnt[n+1]={};
for(int i=1;i<=n;i++)
{
int tmp;
if(a[i].second>=b[i].second) tmp=a[i].second-b[i].second;
else tmp=n+(a[i].second-b[i].second);
ans=max(ans,++cnt[tmp]);
}
cout<<ans<<endl;
}
也可以不排序,创建一个pos数组,让b数组可以通过其,找到a中元素对应的下标就行 再用cnt 每次记录下
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio();
int n;
cin>>n;
int a[n],pos[n+1];
for(int i=0;i<n;i++)
{
cin>>a[i];
pos[a[i]]=i;
}
int cnt[1+n];
memset(cnt,0,sizeof cnt);
for(int i=0;i<n;i++)
{
int t;
cin>>t;
int cur=(n+pos[t]-i)%n;
cnt[cur]++;
}
int ans=0;
for(int i=0;i<1+n;i++)
ans=max(ans,cnt[i]);
cout<<ans;
}