HDU 3336 输出包括从1到len长 字符串前缀的总个数(+DP)

Sample Input
1
4
abab

Sample Output
6
输出包括从1到len长 字符串前缀的总个数
abab:包括2个a,2个ab,1个aba,1个abab

 

 1 # include <cstdio>
 2 # include <cstring>
 3 using namespace std;
 4 
 5 char S[200010] ;
 6 int next[200010] ;
 7 int dp[200010] ;
 8 int len ;
 9 
10 void getNext()
11 {
12     int j, k;
13     j = 0; k = -1; next[0] = -1;
14     while(j < len)
15         if(k == -1 || S[j] == S[k])
16             next[++j] = ++k;
17         else
18             k = next[k];
19 }
20 
21 int main ()
22 {
23     int T ;
24     scanf("%d" , &T); 
25     while (T--)
26     {
27         scanf("%d" , &len) ;
28         scanf("%s" , S) ;
29         getNext() ;
30         dp[0] = 0 ;
31         int ans = 0 ;
32         int i ;
33         for (i = 1 ; i<= len ; i++)
34         {
35             dp[i] = dp[next[i]] + 1 ;
36             dp[i] %= 10007 ;
37             ans += dp[i] ;
38             ans %= 10007 ;
39         }
40         printf("%d\n" , ans) ;
41         
42         
43     }
44     
45     
46     return 0 ;
47 }
View Code

 

posted @ 2015-05-12 17:03  __Meng  阅读(197)  评论(0编辑  收藏  举报