HDU3336 Count the string 一道KMP的巧解

來源:互聯網
上載者:User

http://acm.hdu.edu.cn/showproblem.php?pid=3336 題目

這是喵嗚大神用KMP做的,46MS 

#include <stdio.h>#define MOD 10007char b[200005];int dp[200005];int p[200005];int n;int Pre(){    int s,i,j;    dp[0]=1;    j=-1;    p[0]=-1;    s=1;    for (i=1;i<n;i++)    {        while(j>=0 && b[j+1]!=b[i]) j=p[j];        if (b[j+1]==b[i]) j++;        if (j>=0) dp[i]=(dp[j]+1)%MOD;        else dp[i]=1;        p[i]=j;        s=(s+dp[i])%MOD;    }    return s;}int main(){    int i,j,T;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        scanf("%s",b);        printf("%d\n",Pre());    }    return 0;}

這是更優的,15MS

思路:1、首先確定這個字串的首字母,然後從第二個開始搜起當遇到和首字元一樣的時候,就從該字母開始後面的字元繼續和這個字串的首字元後續的字元進行比較,直到出現不一樣為止,此時相同的字元個數就加到總數上。2、然後繼續 從首字元下一個字元開始,和1步驟差不多,就是這個字元和前面的字元一起往後比較,遇到不一樣又重複這個步驟。。。

#include <stdio.h>char str[200005];int main(){    int t,n,i,j,sum;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        sum=n;        sum%=10007;        scanf("%s",str);        for(i=1;i<n;i++)        {            if(str[i]==str[0])            {                for(j=i;j<n;j++)                {                    if(str[j]!=str[j-i])                        break;                }                sum+=j-i;                sum%=10007;            }        }        printf("%d/n",sum);    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.