hdu 3336 Count the string(KMP or 不KMP)

方法1,31MS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLEN 200005
#define MOD 10007
char str[MAXLEN];
int idx[MAXLEN];
int main()
{
    int T,len,i,j,k,g;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&len);
        scanf("%s",str);
        j=0;
        int count = len % MOD;
        for(i=1; i<len; i++)
        {
            if(str[i]==str[0])
            {
                count=(count+1)%MOD;
                idx[j++]=i;
            }
        }
        for(i=1; i<len; i++)
        {
//  count++;//如果一开始不设为count=len,而设为1,则要加上这句
            for(k=0,g=0; k<j && idx[k] < len; k++)
            {
                if(str[i]==str[ idx[k] + 1 ])
                {
                    count=(count+1)%MOD;
                    idx[g++]=idx[k] + 1;
                }
            }
            j=g;
        }
        printf("%d\n",count%MOD);
    }
    return 0;
}

//**************************************************************************
方法2,KMP,46MS

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLEN 200005
#define MOD 10007
char str[MAXLEN];
int next[MAXLEN],cnt[MAXLEN];
void getNext(int len)
{
    int j=0,k=-1;
    next[0]=-1;
    while(j<len)
    {
        if( k==-1 || str[j]==str[k] )
        {
            j++;
            k++;
            next[j]=k;
        }
        else k=next[k];
    }
}
int main()
{
    int T,len,i;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&len);
        scanf("%s",str);
        getNext(len);
        //    for(i=0;i<=len;i++) printf("%d ",next[i]);
        //    printf("\n");
        int sum=0;
        memset(cnt,0,sizeof(*cnt)*len);
        for(i = 1; i <= len; i++)
        {
            cnt[i] = ( cnt[ next[i] ] + 1 ) % MOD;
            sum = (sum + cnt[i]) % MOD;
        }
        for(i=1; i<=len; i++) printf("%d ",cnt[i]);
        printf("\n");
        printf("%d\n",sum);
    }
    return 0;
}

 

posted @ 2010-08-27 18:56  菜到不得鸟  阅读(352)  评论(0)    收藏  举报