Title

P9978 [USACO23DEC] Cycle Correspondence S 题解

题目大意

两个环呈包含关系,每个环上的元素都不相同,两个环可以自由旋转,问怎么使得重合部分最多。

解题思路

显然,我们对于环 b 记录它的每一个元素最少需要转多少圈才会和 a 中的某一元素重合。然后依次枚举每一个可能旋转的位置,看一下有多少个 bi 可以重合。

AC 代码

#include<math.h>
#include<time.h>
#include<stdio.h>
#include<algorithm>
#define ll long long
#define N 1000005
int n,k,a[N],b[N];
int tong[N],ans;
int cnt1[N],cnt2[N];
int pa[N],pb[N],pf[N];
int fb[N];
namespace Case1{
    inline void Main(){
        for(register int i=k+1;i<=2*k;++i)
            b[i]=b[i-k];
        for(register int i=1;i<=k;++i){
            int cnt=0;
            for(register int j=i;j<k+i;++j)
                if(b[j]==a[j-i+1]) ++cnt;
            ans=std::max(ans,cnt);
        }
        for(register int i=1;i<=k;++i)
            std::swap(b[i],b[k*2-i+1]);
        for(register int i=1;i<=k;++i){
            int cnt=0;
            for(register int j=i;j<k+i;++j)
                if(b[j]==a[j-i+1]) ++cnt;
            ans=std::max(ans,cnt);
        }   
    }
}
namespace Case2{
    inline void Main(){
        for(register int i=1;i<=k;++i)
            fb[k-i+1]=b[i];
        for(register int i=1;i<=k;++i)
            pa[a[i]]=i,pb[b[i]]=i,pf[fb[i]]=i;
        for(register int i=1;i<=k;++i){
            if(pa[b[i]])
                ++cnt1[(pa[b[i]]-pb[b[i]]+k)%k];
            if(pa[fb[i]])
                ++cnt2[(pa[fb[i]]-pf[fb[i]]+k)%k];
        }
        for(register int i=0;i<k;++i)
            ans=std::max({ans,cnt1[i],cnt2[i]});
    }
}
inline void work(){
    scanf("%d%d",&n,&k);
    for(register int i=1;i<=k;++i)
        scanf("%d",&a[i]);
    for(register int i=1;i<=k;++i)
        scanf("%d",&b[i]);
    for(register int i=1;i<=k;++i)
        tong[a[i]]=tong[b[i]]=1;
    int res=0;
    for(register int i=1;i<=n;++i)
        if(tong[i]==0) ++res;
    if(k<=10000) Case1::Main();
    else Case2::Main();
    ans=ans+res;printf("%d",ans);
}signed main(){
    srand(114514);
    srand(rand());
    srand(time(0));
//  freopen(".in","r",stdin);
//  freopen(".out","w",stdout);

    work();return 0;
}
posted @   UncleSam_Died  阅读(35)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示