zoukankan      html  css  js  c++  java
  • CF 432D

    http://codeforces.com/problemset/problem/432/D

    在前缀是后缀的前提下,求这个前缀在原串中出现了多少次

    出现的次数可以用dp求解,前缀是后缀直接用Next判断,较为综合的kmp考察,这题没写出来就是kmp基础不牢,不应该

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std ;
    char B[100005] ;
    int Next[100005],lenA,lenB,dp[100005] ;
    void GetNext()
    {
        int i,j ;
        Next[1]=0 ;  
        j=0 ;
        for(i=2 ;i<=lenB ;i++)
        {
            while(j>0 && (B[j+1]!=B[i]))j=Next[j] ;
            if(B[j+1]==B[i])j++ ;
            Next[i]=j ;
        }
    }
    struct node
    {
        int p,q ;
    }ans[100005] ;
    int cmp(node c,node d)
    {
        return c.p<d.p ;
    }
    int main()
    {
        scanf("%s",B+1) ;
        lenB=strlen(B+1) ;
        GetNext() ;
        for(int i=0 ;i<=lenB ;i++)
            dp[i]=1 ;
        for(int i=lenB ;i>0 ;i--)
        { 
            dp[Next[i]]+=dp[i] ;//前缀在原串中出现了多少次 
            /*
            int j=Next[i] ;
            while(1)
            {
                if(!j)break ;
                dp[j]++ ;
                j=Next[j] ;
            }
            */
        }
        int st=0 ;
        for(int i=lenB ;i>0 ;i=Next[i])//判断前缀是后缀 
            ans[st].p=i,ans[st++].q=dp[i] ;
        sort(ans,ans+st,cmp) ;
        printf("%d
    ",st) ;
        for(int i=0 ;i<st ;i++)
            printf("%d %d
    ",ans[i].p,ans[i].q) ;
        return 0 ;
    }
    View Code
  • 相关阅读:
    Matrix Power Series
    The Noisy Party(BUPT)
    cony
    又见Fibonacci数列
    回文字符串
    街区最短路径问题
    点的变换
    可恶的麦兜(北邮)
    Travel
    Swing实现Java代码编辑器实现关键词高亮显示
  • 原文地址:https://www.cnblogs.com/xiaohongmao/p/3739598.html
Copyright © 2011-2022 走看看