• HDU 4162 Shape Number


    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=4162

    题意:

    求给定字符的一阶差分链的最小表示。

    题解:

    先求一阶差分链,再求一阶差分链的最小表示法。

    代码:

    跑了670MS

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    
    const int maxn = 3e5 + 10;
    
    char s1[maxn],s2[maxn];
    
    int solve(char *s) {
        int i = 0, j = 1, k = 0,len=strlen(s);
        while (i < len&&j < len&&k<len) {
            int t = s[(i + k) % len] - s[(j + k) % len];
            if (!t) k++;
            else {
                if (t > 0) i = i + k + 1;
                else j = j + k + 1;
                if (i == j) j++;
                k = 0;
            }
        }
        return i < j ? i : j;
    }
    
    int main() {
        while (scanf("%s", s1) == 1) {
            int len = strlen(s1);
            for (int i = 0; i < len; i++) {
                s2[i] = (s1[(i + 1) % len] - s1[i] + 8) % 8 + '0';
            }
            s2[len] = '';
            //cout << s2 << endl;
            int pos = solve(s2);
            for (int i = 0; i < len; i++) {
                printf("%c", s2[(pos + i) % len]);
            }
            printf("
    ");
        }
        return 0;
    }

    贴个后缀数组的解法:

    跑了2527MS

    #include<map>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define X first
    #define Y second
    #define mkp make_pair
    #define lson (o<<1)
    #define rson ((o<<1)|1)
    #define mid (l+(r-l)/2)
    #define sz() size()
    #define pb(v) push_back(v)
    #define all(o) (o).begin(),(o).end()
    #define clr(a,v) memset(a,v,sizeof(a))
    #define bug(a) cout<<#a<<" = "<<a<<endl
    #define rep(i,a,b) for(int i=a;i<(b);i++)
    
    typedef long long LL;
    typedef vector<int> VI;
    typedef pair<int,int> PII;
    typedef vector<pair<int,int> > VPII;
    
    const int INF=0x3f3f3f3f;
    const LL INFL=0x3f3f3f3f3f3f3f3fLL;
    const double eps=1e-8;
    
    const int maxn = 3e5 + 10;
    
    char s1[maxn],s2[maxn];
    
    struct SuffixArray{
        char s[maxn];
        int sa[maxn],t[maxn],t2[maxn],c[maxn];
        int n,m;
        void init(int n,int m){
            this->n=n;
            this->m=m;
        }
        void build_sa(){
            int i,*x=t,*y=t2;
            for(i=0;i<m;i++) c[i]=0;
            for(i=0;i<n;i++) c[x[i]=s[i]]++;
            for(i=1;i<m;i++) c[i]+=c[i-1];
            for(i=n-1;i>=0;i--) sa[--c[x[i]]]=i;
            for(int k=1;k<=n;k<<=1){
                int p=0;
    //            for(i=n-k;i<n;i++) y[p++]=i;
    //            for(i=0;i<n;i++) if(sa[i]>=k) y[p++]=sa[i]-k;
                for(i=0;i<n;i++) y[p++]=(sa[i]-k+n)%n;
                
                for(i=0;i<m;i++) c[i]=0;
                for(i=0;i<n;i++) c[x[y[i]]]++;
                for(i=1;i<m;i++) c[i]+=c[i-1];
                for(i=n-1;i>=0;i--) sa[--c[x[y[i]]]]=y[i];
                
                swap(x,y);
                p=1; x[sa[0]]=0;
                for(i=1;i<n;i++){
                    x[sa[i]]=y[sa[i-1]]==y[sa[i]]&&y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++;
                }
                if(p>=n) break;
                m=p;
            }
        }
    }mysa;
    
    int main() {
        while (scanf("%s", s1) == 1) {
            int len = strlen(s1);
            mysa.init(len,256);
            for (int i = 0; i < len; i++) {
                s2[i] = (s1[(i + 1) % len] - s1[i] + 8) % 8 + '0';
            }
            s2[len] = '';
            strcpy(mysa.s,s2);
            mysa.build_sa();
            
            for(int p=mysa.sa[0];p<mysa.sa[0]+mysa.n;p++){
                printf("%c",mysa.s[p%mysa.n]);
            }
            puts("");
        }
        return 0;
    }
  • 相关阅读:
    vue-quill-editor的自定义设置字数长度方法和显示剩余数字
    element-ui表格show-overflow-tooltip="true",鼠标移上去显示的宽度设置
    vue + elementui表单重置 resetFields问题(无法重置表单)
    element ui表单验证,validate与resetFields的使用你知道哪些
    前端下载文件(GET、POST方法)
    vue中使用elementui里的table时,需求是前面的勾选框根据条件判断是否可以勾选设置
    流体力学笔记 第一章 向量场的概念及运算
    Gersgorin定理
    奇异值分解的证明和直观理解
    2020机器学习学习笔记
  • 原文地址:https://www.cnblogs.com/fenice/p/5557650.html
Copyright © 2020-2023  润新知