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 }

浙公网安备 33010602011771号