HDU3336 KMP

例如:

6

           a  b  a  b  a  b  ‘\0’

下标i:   0  1  2  3  4  5   6

Next: -1  0  0  1  2  3  4

dp:     0  1   1  2  2  3  3

dp[ 1 ]=1表示目前:‘a’出现一次

dp[ 2 ]=1:同上:“ab”

dp[ 3 ]=2表示“abab”一次,“ab”一次

dp[ 6 ]=3表示首字母‘a’在整个的出现次数

 

KMP够强大!!!!!

View Code
 1 #include<stdio.h>

 2 #include<string.h>

 3 const int maxn = 200005;

 4 const int mod= 10007;

 5 char a[ maxn ],next[ maxn ];

 6 void getNext( int len ){

 7     next[ 0 ]=-1;

 8     int i,j;

 9     i=0,j=-1;

10     while( i<len ){

11         if( j==-1 || a[ i ]==a[ j ] )

12             i++,j++,next[ i ]=j;

13         else j=next[ j ];

14     }

15 }

16 int dp[ maxn ];//dp[i]:以i结尾的串中所有前缀

17 int main(){

18     int t;

19     scanf("%d",&t);

20     while( t-- ){

21         int len;

22         scanf("%d",&len);

23         memset( dp,0,sizeof( dp ));

24         scanf("%s",a);

25         getNext( len );

26         int ans=0;

27         for( int i=1;i<=len;i++ ){

28             //printf("%d\n",next[i]);

29             dp[ i ]=dp[ next[ i ] ]+1;

30             dp[ i ]%=mod;

31             ans+=dp[ i ],ans%=mod;

32         }

33         printf("%d\n",ans);

34     }

35     return 0;

36 }

 

你可能感兴趣的:(HDU)