• 康托展开 学习笔记(误


    • 这东西不难

    可以解决 某排列是1-n排列中的字典序第几位(康托展开),1-n 排列中的第(k)为哪个排列两个问题(康托展开的逆运算)

    复杂度可以拿数据结构优化

    一般我们用x进制数进行hash没有用康托展开进行hash优秀

    实际上很好yy出来

    这里放一个没有优化的暴力求法

    Code:

    #include <cstdio>
    #define ll long long
    ll n,k,a[20],fac[20],used[20];
    ll cantor()
    {
        ll rk=0;
        for(ll cnt,i=1;i<=n;i++)
        {
            cnt=0;
            for(ll j=i+1;j<=n;j++) cnt+=a[i]>a[j];
            rk+=fac[n-i]*cnt;
        }
        return rk+1;
    }
    void recantor()
    {
        for(ll i=1,j;i<=n;i++)
        {
            ll rk=k/fac[n-i];
            k%=fac[n-i];
            j=1;
            while(used[j]) ++j;
            for(;rk;j++) if(!used[j]) rk--;
            while(used[j]) ++j;
            a[i]=j;
            used[j]=1;
        }
    }
    int main()
    {
        scanf("%lld",&n);
        fac[0]=1;
        for(ll i=1;i<=n;i++) fac[i]=i*fac[i-1];
        for(ll i=1;i<=n;i++) scanf("%lld",a+i);
        printf("%lld
    ",cantor());
        scanf("%lld",&k);--k;
        recantor();
        for(ll i=1;i<n;i++) printf("%lld ",a[i]);
        printf("%lld
    ",a[n]);
        return 0;
    }
    

    2018.8.8

  • 相关阅读:
    常用Git代码托管服务分享
    .NET中操作IPicture、IPictureDisp
    Git学习笔记与IntelliJ IDEA整合
    螺旋队列问题
    杂题3道
    .NET 配置文件简单使用
    C++之Effective STL
    不容易理解的 lock 和 merge
    状态模式
    观察者模式
  • 原文地址:https://www.cnblogs.com/butterflydew/p/9443571.html
Copyright © 2020-2023  润新知