Codeforces Round #648 (Div. 2) C. Rotation Matching ###K ###K //K

题意:给两段序列  可以随意左移右移 问最多a b有多少个数 在同一个位置相同

题目链接:https://codeforces.ml/contest/1365/problem/C

一直在考虑 如何算出每一次移动有多少个数相等 但只想到再让每一个数比较

一次看多少个数 相等 这样n^2 显然不对

正解应该是 考虑每个数的贡献 如果要匹配上 那么需要往右移多少步(左右是相同的)

这样就只需要对每个数做一次处理  就可以o(n) 处理完

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define pb push_back
 5 const int maxn =2e5+10;
 6 const int mod=1e9+7;
 7 int b[maxn];
 8 int cnt[maxn],mp[maxn];
 9 int main()
10 {
11     ios::sync_with_stdio(false);
12     cin.tie(0);
13     int n;
14     cin>>n;
15     for(int i=1;i<=n;i++)
16     {
17         int x;
18         cin>>x;
19         mp[x]=i;
20     }
21     for(int i=1;i<=n;i++)
22     {
23         cin>>b[i];
24     }
25     int ans=1;
26     for(int i=1;i<=n;i++)
27     {
28         int p=mp[b[i]]-i;
29         if(p<0) p+=n;
30         cnt[p]++;
31         ans=max(ans,cnt[p]);
32     }
33     cout<<ans<<'\n';
34 
35 
36 
37 
38 
39 
40 }
View Code

 

posted @ 2020-06-08 18:26  canwinfor  阅读(188)  评论(0)    收藏  举报