精华内容
下载资源
问答
  • 最小表示法总结+例题

    2019-09-20 21:26:07
    给一个字符串,如果这个字符串是环状的,它的字典序最小表示方法是什么。 O(n)算法 与kmp相似,都是相同的不再比较。 i和j为两个不同的起点引领的长度为k的字符串 int n=strlen(s+1); for(int i=1;i<=n;i++) { ...

    给一个字符串,如果这个字符串是环状的,它的字典序最小的表示方法是什么。
    O(n)算法
    与kmp相似,都是相同的不再比较。
    贪心思想,谁大谁就往后移动。
    i和j为两个不同的起点引领的长度为k的字符串

    int n=strlen(s+1);
    for(int i=1;i<=n;i++)
    {
        s[n+i]=s[i];
    }
    
    int i=1,j=2,k;
    
    while(i<=n&&j<=n)
    {
        for(k=0;k<n&&s[i+k]==s[j+k];k++)
            continue;
    
        if(k==n) break;//S只由一个字符构成
    
        if(s[i+k]>s[j+k])
        {
            i=i+k+1;
            if(i==j) i++;
        }
        else
        {
            j=j+k+1;
            if(i==j) j++;
        }
    }
    ans=min(i,j); //b[ans]是最小表示。
    
    
    

    例题:
    1.Glass Beads POJ - 1509
    题意:给定n个字符串,求的最小表示的下标,从1开始。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>
    using namespace std;
    int  minpre(char s[])
    {
    	int m = strlen(s);
    	memcpy(s + m, s,m*sizeof(char));
    	int i = 0,j = 1;//i表示从i往后是有可能的,j表示下一个试探的位置 
    	while(j < m && i < m) 
    	{
    		int k;
    		for (k = 0;s[i + k] == s[j + k] && k < m; k++)
    		if(k == m ) return min(i,j);//如果相等了,那最小的就是答案 
    		if(s[i + k] > s[j + k]) i = i + k + 1;//i到i+k开始的都不可能 
    		else (j = j + k + 1);//同上 
    	    if (i == j) j++;//刚好相等,重新比较 
    	    
    	}
    	if(i < m) return i;
    	else return j;
    }
     
    int main()
    {
        char s[20005];
    	int n;
    	scanf("%d",&n);
    	while(n--)
    	{
    		scanf("%s",s);
    	    printf("%d\n",minpre(s) + 1);
    	}	
    } 
    

    2.How many HDU - 2609
    题意:给出n个字符串,若这些字符串都是环状,问一共有几个不同的字符串。
    做法:每个字符串的最小表示放在set里去重

    #include<stdio.h>
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int maxn=1e4+20;
    const int mod=1e9+7;
    string s;
    int len;
    int GetMin(){
        int i=0,j=1,k=0;
        while(i<len&&j<len&&k<len){
            int t=s[(i+k)%len]-s[(j+k)%len];
            if(t==0)k++;
            else{
                if(t>0)i=i+k+1;
                else j=j+k+1;
                if(i==j)j++;
                k=0;
            }
        }
        return min(i,j);
    }
    int main(){
        int n;
        while(scanf("%d",&n)!=EOF){
            set<string>sub;
            for(int i=0;i<n;i++){
                cin>>s;
                len=s.size();
                s+=s;
                int l=GetMin();
                sub.insert(s.substr(l,len));
            }
            printf("%d\n",sub.size());
        }
        return 0;
    }
    
    
    
    展开全文
  • 首先我们解释一下最小表示法,对于一个字符串,我们把它首尾相连看作循环的“项链”,那么我们以每个珠子算起,都会形成一条长度为n的链,其中字典序最小的那个就是这个串的最小表示。 正常的我们怎么找这个最小...

           首先我们解释一下最小表示法,对于一个字符串,我们把它首尾相连看作循环的“项链”,那么我们以每个珠子算起,都会形成一条长度为n的链,其中字典序最小的那个就是这个串的最小表示。

           正常的我们怎么找这个最小表示呢,如果暴力的话,枚举每两个串作比较,但是复杂度过高,这就用到O(n)的最小表示法了。

           我们把这个字符串复制一下接在原字符串的后边,比如“bacbasf”我们变成“bacbasfbacbasf”记作SS。

           然后我用两根指针指向两个不同的字符。初始化i=1;j=2;然后我们另k=0,从前往后比较i+k和j+k,当碰到某个k,两个字符不相等时候,比较哪个小,假如i的大,那么i到i+k的全部都比一定存在一个位置j比这个串小打的,因为上边我们选这个k的前提是(i~i+k)==(j~j+k)所以这个对于i到i+k为起点的都

    存在一个j+k比他小,所以i指针变到i+k+1的位置,如果正好和j相等就i++;

    下边是模板:

    
        int n=strlen(now+1);   //字符串从1位置开始
        for(int i=1;i<=n;i++)now[i+n]=now[i];
        int i=1,j=2,k;
        while(i<=n&&j<=n){
            for(k=0;k<n&&now[i+k]==now[j+k];k++);
            if(k==n)break;
            if(now[i+k]>now[j+k]){
                i=i+k+1;
                if(i==j)i++;
            }
            else{
                j=j+k+1;
                if(i==j)j++;
            }
        }
        int ans=min(i,j);

     

         以下我们介绍这个经典的雪花的最小表示做法:

    我们对于每个雪花存下他的正序和逆序的最小表示做法,在用vector拉链后我们比对是否存在的时候就不需要每个位置暴力两次,在比较两朵雪花的时候,我们比较存下的每个的两个最小表示法就可以了,两个正序两个逆序,比较四次就可以了:

    #include<iostream>
    #include<string.h>
    #include<vector>
    #include<stdio.h>
    #define ll long long
    using namespace std;
    int C[100005][10];
    int Min[100005][10];
    int Min2[100005][10];
    vector<int>v[20000];
    void fun(int x)
    {
        int now[20];
        for(int i=1;i<=6;i++)now[i]=C[x][i],now[i+6]=C[x][i];
        int i=1,j=2,k;
        while(i<=6&&j<=6){
            for(k=0;k<6&&now[i+k]==now[j+k];k++);
            if(k==6)break;
            if(now[i+k]>now[j+k]){
                i=i+k+1;
                if(i==j)i++;
            }
            else{
                j=j+k+1;
                if(i==j)j++;
            }
        }
        int ans=min(i,j);
        for(int i=1;i<=6;i++){
            Min[x][i]=now[ans++];
        }
    }
    void fun2(int x)
    {
        int now[20];
        for(int i=1;i<=6;i++)now[i]=C[x][7-i],now[i+6]=C[x][7-i];
        int i=1,j=2,k;
        while(i<=6&&j<=6){
            for(k=0;k<6&&now[i+k]==now[j+k];k++);
            if(k==6)break;
            if(now[i+k]>now[j+k]){
                i=i+k+1;
                if(i==j)i++;
            }
            else{
                j=j+k+1;
                if(i==j)j++;
            }
        }
        int ans=min(i,j);
        for(int i=1;i<=6;i++){
            Min2[x][i]=now[ans++];
        }
    }
    bool check(int x,int y)
    {
        bool f=1,f2=1,f3=1,f4=1;
        for(int i=1;i<=6;i++){
            if(Min[x][i]!=Min[y][i])f=0;
        }
        for(int i=1;i<=6;i++){
            if(Min2[x][i]!=Min2[y][i])f2=0;
        }
        for(int i=1;i<=6;i++){
            if(Min[x][i]!=Min2[y][i])f3=0;
        }
        for(int i=1;i<=6;i++){
            if(Min2[x][i]!=Min[y][i])f4=0;
        }
        return f||f2||f3||f4;
    }
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            for(int i=0;i<=13131;i++)v[i].clear();
            bool f=1;
            for(int i=1;i<=n;i++){
                ll sum=0;
                for(int j=1;j<=6;j++){
                    scanf("%d",&C[i][j]);
                    sum+=C[i][j];
                }
                fun(i);fun2(i);
                sum%=13131;
                int len=v[sum].size();
                for(int j=0;j<len;j++){
                    if(check(v[sum][j],i))f=0;
                }
                v[sum].push_back(i);
            }
          /*  for(int i=1;i<=n;i++){
                for(int j=1;j<=6;j++){
                    cout<<Min[i][j]<<" ";
                }
                cout<<endl;
            }*/
            if(f){
                printf("No two snowflakes are alike.\n");
            }
            else{
                printf("Twin snowflakes found.\n");
            }
        }
    }
    

     

    展开全文
  • 最小表示法是求与某个字符串循环同构的所有字符串中,字典序最小的串是哪个。 比如说一个字符串jdrakioi,它长为8,也就是说最多有八种循环同构的方法。 jdrakioi、drakioij、rakioijd、akioijdr、kioijdra、...

    最小表示法是求与某个字符串循环同构的所有字符串中,字典序最小的串是哪个。

    比如说一个字符串jdrakioi,它长为8,也就是说最多有八种循环同构的方法。

    jdrakioi、drakioij、rakioijd、akioijdr、kioijdra、ioijdrak、oijdraki、ijdrakio。

    这几个串在原串上的开始位置分别是0,1,2,3,4,5,6,7。

    默认从0开始比较方便,这一点之后也会再提到。

    暴力方法很简单,把所有的都列出来再排个序就行了,不再赘述。

    暴力的时间复杂度是很高的,然而我们可以做到O(n)求出字典序最小的串的开始位置。

    设i、j是两个“怀疑是最小的位置”,比如说如果你比较到了jdrakioi的两个i,你目前还不知道从哪个i开始的字符串是最小的。

    设k表示,从i往后数和从j往后数,有多少是相同的。

    开始时先设i=0,j=1,k=0。

    每次都对i+k、j+k进行一次比较。

    发现i+k有可能大于字符串长度n啊,怎么办呢?

    首先想到将字符串倍长:jdrakioijdrakioi。

    但是这样做很麻烦,而且倍长之后,前后两段都是完全一样的。

    所以我们只需要取模n就好了:(i+k)%n。

    这么做就要求字符串从0开始,如果从1开始的话,就有点麻烦了,还得+1-1什么的,不如从0开始简单明了。

    比较完i+k和j+k,如果两个字符相等,那么显然k++。

    如果不相等,那么哪边比较大,哪边就肯定不是最小的了,同时把k重置为0。

    如果出现了i、j重合的情况,把j往后移动一位。

    最后输出i、j较小的那个就好了。

    int getmin()
    {
        int i=0,j=1,k=0,t;
        while(i<n&&j<n&&k<n)
        {
            t=s[(i+k)%n]-s[(j+k)%n];
            if(!t)k++;
            else
            {
                if(t>0)i+=k+1;
                else j+=k+1;
                if(i==j)j++;
                k=0;
            }
        }
        return i<j?i:j;
    }

    然后接一道裸题:hdu 2609 How many

    跑完最小表示法之后,拿个map检查是否出现过就好了。

    注意有多组输入输出。

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<algorithm>
     4 #include<map>
     5 using namespace std;
     6 
     7 int n,len,ans;
     8 
     9 struct str
    10 {
    11     char a[105];
    12     friend bool operator < (str q,str w)
    13     {
    14         for(int i=0;i<len;i++)
    15         {
    16             if(q.a[i]==w.a[i])continue;
    17             return q.a[i]<w.a[i];
    18         }
    19         return 0;
    20     }
    21 };
    22 
    23 void getmin(str &x)
    24 {
    25     int i=0,j=1,k=0,t;
    26     while(i<len&&j<len&&k<len)
    27     {
    28         t=x.a[(i+k)%len]-x.a[(j+k)%len];
    29         if(!t)k++;
    30         else
    31         {
    32             if(t>0)i+=k+1;
    33             else j+=k+1;
    34             if(i==j)j++;
    35             k=0;
    36         }
    37     }
    38     i=(i<j?i:j);
    39     str buf;
    40     for(int p=0;p<len;p++)buf.a[p]=x.a[(p+i)%len];
    41     x=buf;
    42 }
    43 
    44 map<str,bool>mp;
    45 
    46 int main()
    47 {
    48     while(scanf("%d",&n)!=EOF)
    49     {
    50         ans=0;
    51         mp.clear();
    52         for(int i=1;i<=n;i++)
    53         {
    54             str nw;
    55             scanf("%s",nw.a);
    56             len=strlen(nw.a);
    57             getmin(nw);
    58             if(mp[nw])continue;
    59             else ans++,mp[nw]=1;
    60         }
    61         printf("%d\n",ans);
    62     }
    63     return 0;
    64 }
    View Code

     bzoj 1398 Vijos1382寻找主人 Necklace

    还是裸题。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    struct str
    {
        char a[1000005];
    }s1,s2;
    
    int len;
    
    void getmin(str &x)
    {
        int i=0,j=1,k=0,t;
        while(i<len&&j<len&&k<len)
        {
            t=x.a[(i+k)%len]-x.a[(j+k)%len];
            if(!t)k++;
            else
            {
                if(t>0)i+=k+1;
                else j+=k+1;
                if(i==j)j++;
                k=0;
            }
        }
        i=(i<j?i:j);
        str buf;
        for(int p=0;p<len;p++)buf.a[p]=x.a[(p+i)%len];
        x=buf;
    }
    
    int main()
    {
        scanf("%s",s1.a);
        scanf("%s",s2.a);
        len=strlen(s1.a);
        if(len!=strlen(s2.a))return printf("No"),0;
        getmin(s1);
        getmin(s2);
        for(int i=0;i<len;i++)
            if(s1.a[i]!=s2.a[i])
                return printf("No"),0;
        printf("Yes\n");
        printf("%s",s1.a);
        return 0;
    }
    View Code

     

    转载于:https://www.cnblogs.com/eternhope/p/9972846.html

    展开全文
  • 最小表示法

    2020-10-16 23:25:30
    文章目录最小表示法1.算法分析2.模板3.典型例题 最小表示法 1.算法分析 ​ 给定一个字符串S[1~n],如果不断把最后一个字符放到开头,最终会得到n个字符串,称这n个字符串是循环同构的。这些字符串中字典序最小的一...

    最小表示法

    1.算法分析

    ​ 给定一个字符串S[1~n],如果不断把最后一个字符放到开头,最终会得到n个字符串,称这n个字符串是循环同构的。这些字符串中字典序最小的一个,称为字符串S的最小表示法。可以在O(n)O(n)的时间内找出字符串的最小表示法。

    2.模板

    /*最大表示法*/
    int Get_max(char s[]) {
       int i = 0, j = 1, k = 0, t;
       int len = strlen(s);
       while(i < len && j < len && k < len) {
           t = s[(i + k) % len] - s[(j + k) % len];
           if(!t) k++;
           else {
               if (t > 0) j += k + 1;//与最小模板比,只有这里和下方变了
               else i += k + 1;//
               if(i == j) j++;
               k = 0;
           }
       }
       return min(i, j);
    }
    
    /*最小表示法*/
    int Get_min(char s[]) {
        int i = 0, j = 1, k = 0, t;
        int len = strlen(s);
        while(i < len && j < len && k < len) {
            t = s[(i + k) % len] - s[(j + k) % len];
            if(!t) k++;//两字符相等 
            else {
                if(t > 0) i += k + 1;//i位置数值大
                else j += k + 1;
                if(i == j) j++;//i,j指针指向同一位置时
                k = 0;
            }
        }
        return min(i, j);
    }
    

    3.典型例题

    luogu P1368 【模板】最小表示法

    题意: 找出一个序列的最小表示法,序列长度:n<=3105n <= 3*10^5

    题解:最小表示法模板题

    代码

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int const N = 6e5 + 10;
    typedef long long LL;
    
    int n, T, m, a[N];
    
    int get_min() {
        int i = 0, j = 1, k = 0, t;
        while(i < n && j < n && k < n) {
            t = a[(i + k) % n] - a[(j + k) % n];
            if (!t) k++;
            else {
                if (t > 0) i += k + 1;
                else j += k + 1;
                if (i == j) j++;
                k = 0;
            }
        }
        return min(i, j);
    }
    
    int main() {
        cin >> n;
        for (int i = 0; i < n; ++i) {
            scanf("%d", &a[i]);
        }
        int idx=  get_min();
        for (int i = idx; i < idx + n; ++i) {
            cout << a[i % n] << " ";
        }
    
        return 0;
    }
    

    HDU-2609 How many

    题意: 每组数据给出 n 个可循环字符串,问有多少种不同的字符串

    题解:将每个字符串的最小(大)表示法计算出来,然后丢到set中判重

    代码

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int const N = 1e4 + 10;
    
    char str[N],temp[N];
    
    int Get_max(char s[]) {
       int i = 0, j = 1, k = 0, t;
       int len = strlen(s);
       while(i < len && j < len && k < len) {
           t = s[(i + k) % len] - s[(j + k) % len];
           if(!t) k++;
           else {
               if (t > 0) j += k + 1;//与最小模板比,只有这里和下方变了
               else i += k + 1;//
               if(i == j) j++;
               k = 0;
           }
       }
       return min(i, j);
    }
    
    int main(){
        int n;
        while(scanf("%d",&n)!=EOF){
            set<string> S;
            for(int i = 0; i < n; i++){
                scanf("%s",str);
                int index = Get_max(str);//最小表示法的索引
                int len = strlen(str);
                for(int j = 0; j < len; j++)
                    temp[j]=str[(index + j) % len];
                S.insert(temp);
            }
            printf("%d\n",S.size());
        }
        return 0;
    }
    
    展开全文
  • 使用优化的算法计算nextnextnext数组:4.luogu P3375 【模板】KMP字符串匹配5.UVA1328 Period二、字符串的最小表示1.AcWing 137. 雪花雪花雪花 声明: 本系列博客是《算法竞赛进阶指南》+《算法竞赛入门经典》+...
  • 求 循环节用kmp 最小最大表示法直接套用模板 最小/大表示法:开两个位置坐标 参数 i,j以及 跨度k(自己瞎起的名字,感觉很合适 噗…) 利用while循环进行多级跳转比较(每一个位置为首字符串所有都比较一遍 i,j 各作为一...
  • 求最大公约数用辗转相除:比如有两个正整数a,b。那么a和b的最大公约数等于b和c的最大公约数,而c表示余数:c=a%b。 求最小公倍数的方法是:两个数的乘积恰好等于它们最大公约数和最小公倍数的乘积,而我们只要求...
  • 冒泡排序 运用 raptor 算法:相邻的两个数进行比较,根据大小交换,最大的数下沉到后面,最小的数上升一个位次 如果有n个数,需要比较n-1轮,每轮比较n-1次 P70-8、100名同学拉成一圈,按编号1、2、3 ……...
  • 例题3-6环状序列

    2020-01-15 17:52:59
    在这些表示法中,字典序最小的称为“最小表示”。输入一个长度为n(n<=100)的环状DNA串(只包含A、C、G、T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示。例如,CTCC的最小表示是CCCT,CGAGTCAGCT的...
  • 例题3-9环状序列

    2017-05-02 19:57:28
    在这些表示法中,字典序最小的成为“最小表示”。输入一个长度为n(n&lt;=100)的环状DNA串(只包含A,C,G,T)的一种表示法你的任务是输出该环状串的最小表示。例如,CTCC的最小表示是CCCT。...
  • 例题3-6 环状序列

    2019-02-02 01:28:01
    /*例题3-6 环状序列(CircularSequence, ACM/ICPC Seoul 2004, UVa1584)长度为n的环状串有n种表示法,分别为从某个位置开始顺时针得到。例如,图3-4中的环状串有10种表示:CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。...
  • 例题3_10 环状序列

    2018-08-22 23:24:07
    在这些表示法中,字典序最小的称为”最小表示“。输入一个长度为n(n&lt;=100)的环状DNA串(只包含A,C,G,T这个4种字符),你的任务是输出该环状串的最小表示。例如CTCC的最小表示是CCCT,CGAGTCAGCT的最小表示为....
  • 在这些表示法中,字典序最小的称为“最小表示”。 输入一个长度为n(1<=n<=100)的环状DNA串(只包含A、C、G、T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示。例如,CTCC的最小表示是CCCT,...
  • 长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到。例如,图3-4的环状串 有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称 为"最小表示"。 输入一个...
  • 长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到。例如,图3-4的环状串 有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称 为"最小表示"。 输入一个长度为n(n≤...
  • 长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到。例如,图3-4的环状串 有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称 为"最小表示"。 输入一个...
  • 长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到。例如,图3-4的环状串 有10种表示: CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称 为"最小表示"。 输入一个长度为n...
  • 【题目描述】 长度为n的环状串有n种表示法,分别为某个位置开始顺时针得到。...=100)的环状DNA串(只包含A、C、G、T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示。例如,CTCC的最小表...
  • 这题,不要KMP,不要最小表示法,只要暴力就能过…… code: #include<iostream> #include<cstdio> using namespace std; int main() { string a,b,c; cin>>a>>b; if (a.size()>b....
  • 这道题目可用两个伪指针,一个伪指针指向当前保存的最小字典序的表示法的开头,另一个伪指针去枚举起始点,并且去比较两个指针对应的串的字典序,更新最小值。一般环状模拟问题都可以用伪指针+线性表+模来解。 源...
  • 排序总结

    2018-03-23 20:43:55
    冒泡排序 从低到高慢慢扩大已排序部分。找到未排序部分的第一个位置,然后从数组末尾开始依次比较相邻两个元素,如果大小关系相反则交换位置。这样可以保证每次都把最小的那个换到最前面。如果某一次没有元素...
  • 例题3-6 环状序列(Circular Sequence, ACM/ICPC Seoul 2004, UVa1584)长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到。例如,图3-4的环状串 有10种表示:CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。...
  • 文章目录1 并查集、图相关算法1.1 并查集1.1.1 并查集基本结构和操作1.1.2 例题1.2 图相关算法1.2.1 图的概念1.2.2 图的表示方法1.2.2.1 邻接表表示法1.2.2.2 邻接矩阵表示法1.2.3 图的遍历1.2.3.1 宽度优先遍历1.2....
  • 典型例题: 部分背包问题, 直接用贪心求的解即最优解,;而0-1背包问题额不能用贪心去求最优解。 下面给出几道贪心的典型例题,在知道思路的情况,可遇到题目则以不变应万变去求解。 例题1 : 区间选点 给定N...
  • 第一章 最优化的基本概念 1.最优化求解的数学模型建立 2.例题(考试第一大题:数学模型建立) 解析:优化变量、目标函数(一般取...3.最优化方法:解析与数值解法(数值迭代) 4.迭代终止准则...
  • 对于一个分数a/b,表示法有许多种,其中加数少的比加数多的好,如果加数个数相同,则最小的分数越大越好。 输入: 两个正整数 a,b(0&amp;amp;lt;a&amp;amp;lt;b&amp;amp;lt;500) 输出: 表达式,详见...
  • 推导过程【1】简化矩阵【2】最小二乘法代数表示三.岭回归1.原理2.如何选择lambda【1】岭迹分析【2】VIF【3】最小化均方预测误差四.LASSO回归1.原理2.具体概述四.岭回归和lasso回归的应用1.例题题目2.分析五.何时...
  • 20.3.6树和森林的表示法_3_6; a0 ?$ C5 K) |" K2 [6 t7 }2 i 21.3.7树和森林的遍历_3_7+ j4 p( B5 s6 `" n N |3 @ 22.3.8哈夫曼树和哈夫曼树编码_3_8' l) t* ^( i* Y% a ~. e, S- J 23.章节总结及典型例题分析_3_9' ...
  • 第三章图论(十二)

    2020-05-29 12:30:14
    例题:257. 关押罪犯 怨气值数据范围是1~109,暗示着我们用二分,为了让监狱内部的怨气值越小,则需要尽量把怨气值大的罪犯分开 check(x):表示将任意怨气值大于 x 的两名罪犯放在两个监狱,且两个监狱内部的最大...

空空如也

空空如也

1 2 3
收藏数 47
精华内容 18
关键字:

最小表示法例题