码迷,mamicode.com
首页 > 其他好文 > 详细

字符串板子

时间:2019-12-21 10:10:44      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:gif   puts   can   style   print   sed   cli   int   pre   

 上板子

KMP

技术图片
    for(int i=1;i<n;i++){
        while(u>0&&s[u]!=s[i]){
            u=Pi[u-1];
        }
        if(s[u]==s[i]){
            u++;
        }
        Pi[i]=u;
    }
KMP

Z Algorithm

技术图片
    for(int i=1,l=0,r=0;i<len;i++){
        if(i<=r)Z[i]=min(r-i+1,Z[i-l]);
        else Z[i]=0;
        while(s1[Z[i]]==s1[i+Z[i]])Z[i]++;
        if(i+Z[i]>r){
            for(int j=r+1;j<i+Z[i];j++)Pi[j]=j-i+1;
            r=i+Z[i]-1,l=i;
        }
    }
Z Algorithm

各种用法

技术图片
//查找子串t在s中出现的位置 
    int u = 0;
    for(int i=1;i<m;i++){
        while(u>0&&t[u]!=t[i])u=Pi[u];
        if(t[u]==t[i])u++;
        Pi[i]=u;
    }
    u=0;
    for( int i = 0;i < n; i++){
        while(u>0&&t[u]!=s[i])u=Pi[u];
        if(t[u]==s[i])u++;
        if(u==m){
            printf("%d\n",i-m+1);
            u=Pi[u];
        }
    }
    //查找每个前缀的出现次数 
    KMP(s,n,Pi);
    for (int i = 0; i < n; i++) ans[pi[i]]++;
    for (int i = n - 1; i > 0; i--) ans[pi[i - 1]] += ans[i];
    for (int i = 0; i <= n; i++) ans[i]++; 
    //查找本质不同子串数目
    for(int i=0;i<n;i++){
        char c;int MAX=0;
        cin>>c;
        strcat(s,c);s1=s;
        reverse(s1,s1+i+1);
        KMP(s1,i+1,Pi);
        for(int j=0;j<=i;j++)MAX=max(MAX,s1[j]);
        ans+=(i-MAX);
    }
    //查找b与a的每一个后缀的最长公共前缀 
    scanf("%s%s",s2,s1);
    int len1=strlen(s1);
    int len2=strlen(s2);
    strcat(s1,"#");
    strcat(s1,s2);
    int len=len1+len2,l=0,r=0;
    for(int i=1;i<=len;i++){
        if(i<=r)z[i]=min(r-i+1,z[i-l]);
        else z[i]=0;
        while(s1[z[i]]==s1[i+z[i]])z[i]++;
        if(i+z[i]>r)r=i+z[i]-1,l=i;
    }
    for(int i=0;i<len1;i++){
        if(!i)printf("%d ",len1);
        else printf("%d ",z[i]);
    }
    puts("");
    for(int i=len1+1;i<=len;i++){
        printf("%d ",z[i]);
    }
    //字符串压缩
    Z Algorithm(s,n,Z);
    for(int i=1;i<n;i++){
        if((n%i==0)&&(z[i]+i==n)){
            printf("%d ",i);
        }
    }//Z
    puts("");
    KMP(s1,n,Pi);
    printf("%d",n-Pi[n-1]);//KMP
KMP Z Altorithm

字符串板子

标签:gif   puts   can   style   print   sed   cli   int   pre   

原文地址:https://www.cnblogs.com/passione-123456/p/12075773.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!