HDU 3336 Count the string (KMP+DP)

题目大意:给你一个字符串,求所有前缀在原串的出现次数之和

KMP的next指针相当于可以转移的位置呀

把next指针当成边跑拓扑就行啦!

 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <cstring>
 4 #define N 200100
 5 #define mod 10007
 6 #define ui unsigned int
 7 using namespace std;
 8 
 9 int T,n,m,len;
10 int nxt[N];
11 ui f[N];
12 char s[N];
13 void clr()
14 {
15     memset(f,0,sizeof(f));
16     memset(s,0,sizeof(s));
17     memset(nxt,0,sizeof(nxt));
18 }
19 void get_kmp()
20 {
21     int i=0,j=-1;
22     nxt[0]=-1;
23     while(i<=len)
24     {
25         if(j==-1||s[i]==s[j])
26         {
27             i++;
28             j++;
29             nxt[i]=j;
30         }else{
31             j=nxt[j];
32         }
33     }
34 }
35 ui solve()
36 {
37     ui ans=0;
38     for(int i=1;i<=len;i++)
39     {
40         if(nxt[i]>=0) f[i]=f[nxt[i]]+1;
41         else f[i]=1;
42         f[i]%=mod;
43         ans+=f[i];
44         ans%=mod;
45     }
46     return ans;
47 }
48 
49 int main()
50 {
51     scanf("%d",&T);
52     while(T--)
53     {
54         scanf("%d",&n);
55         clr();
56         scanf("%s",s);
57         len=strlen(s);
58         get_kmp();
59         printf("%u\n",solve());
60     }
61     return 0;
62 }
63 
64     
65     
原文地址:https://www.cnblogs.com/guapisolo/p/9696938.html