码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 3336 Count the string (KMP+DP)

时间:2018-09-24 23:22:03      阅读:237      评论:0      收藏:0      [点我收藏+]

标签:string   col   pac   The   sig   unsigned   nbsp   i++   出现   

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

打个表推推,KMP+DP随便水水就过了吧

 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     

 

hdu 3336 Count the string (KMP+DP)

标签:string   col   pac   The   sig   unsigned   nbsp   i++   出现   

原文地址:https://www.cnblogs.com/guapisolo/p/9696938.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!