zoukankan      html  css  js  c++  java
  • cf 432D Prefixes and Suffixes kmp

    题目给出一个字符串,合法的子串是该字符串的前缀,且存在一个后缀与他匹配。求一共有几个合法的子串,并求出每个合法的子串在字符串中出现的次数。

    第一问可以直接用kmp的p数组解决,除了原字符串本身外最长的合法子串是1----p[ len ],第二长的是1----p[ p[ len ] ],直到为0,累加就好。统计次数递推来做。

    #include <cstdio>
    #include <cstring>
    using namespace std;
    #define maxn 100010
    int p[maxn];
    char a[maxn];
    int pos[maxn];
    int cnt[maxn];
    
    int main()
    {
        int i,j;
        int len;
        int tot=0;
        scanf("%s",a+1);
        len=strlen(a+1);
        j=0;p[1]=0;
        for(i=2;i<=len;i++)
        {
            while(j>0&&a[i]!=a[j+1]) j=p[j];
            if(a[i]==a[j+1]) j++;
            p[i]=j;
        }
        i=len;
        while(p[i]!=0)
        {
            tot++;
            pos[tot]=p[i];
            i=p[i];
        }
        tot++;pos[tot]=len;
        j=len;
        for(i=1;i<=len;i++) cnt[i]=1;
        for(i=len;i>0;i--)
            cnt[p[i]]+=cnt[i];
        printf("%d
    ",tot);
        for(i=tot-1;i>0;i--)
            printf("%d %d
    ",pos[i],cnt[pos[i]]);
        printf("%d 1
    ",len);
        return 0;
    }


     

  • 相关阅读:
    机器学习之朴素贝叶斯
    机器学习之KNN
    格式化数字
    web.xml中load-on-startup的作用
    ExecutorService线程池
    201404转成 2014.04
    DBCP连接池配置示例
    java 写文本换行
    打印IP 来源
    MySQL分库分表的一些技巧
  • 原文地址:https://www.cnblogs.com/vermouth/p/3832209.html
Copyright © 2011-2022 走看看