hdu 6153

Posted 一个_小菜鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 6153相关的知识,希望对你有一定的参考价值。

http://acm.hdu.edu.cn/showproblem.php?pid=6153

题意:有两个字符串,第一个是母串,第二个是子串,问子串的前缀可以匹配多少个母串,然后在乘以它的长度的总和

思路:把字符串反过来,用kmp匹配,然后匹配的时候统一一下这个串出现过多少次,然后还有就是这个串的子串出现的次数一定要加上它

因为如果可以匹配后面的,那么前面的也是一定可以匹配的。那么也就是前面的也是它的子串

 

 1 #include <stdio.h>
 2 #include <string.h>
 3 const int mod = 1e9+7;
 4 const int maxn = 1e6+50;
 5 char s[maxn];
 6 char t[maxn];
 7 int next[maxn];
 8 long long cnt[maxn];
 9 
10 void getnext()
11 {
12     int i = 0 , j = -1;
13     next[0] = -1;
14     int len = strlen(t);
15     while(i<len)
16     {
17         if(j==-1||t[i]==t[j])
18             next[++i] = ++j;
19         else
20             j = next[j];
21     }
22 }
23 
24 void kmp_count()
25 {
26     int slen = strlen(s);
27     int tlen = strlen(t);
28     getnext();
29     long long ans = 0;
30     for(int i = 0,j = 0;i<=slen;i++)
31     {
32         while(j&&s[i]!=t[j])
33         {
34             cnt[j]++;
35             j = next[j];
36         }
37         if(s[i]==t[j])
38             j++;
39         if(j==tlen)
40         {
41             cnt[j]++;
42             j = next[j];
43         }
44     }
45     for(int i = tlen;i>=0;i--)
46     {
47         cnt[i] += cnt[i+1];
48         ans =(ans%mod+((cnt[i]%mod)*i)%mod)%mod;
49     }
50     printf("%lld\n",ans);
51 }
52 
53 
54 int main()
55 {
56     int tt;
57     scanf("%d",&tt);
58     while(tt--)
59     {
60         memset(s,0,sizeof(s));
61         memset(t,0,sizeof(t));
62         memset(cnt,0,sizeof(cnt));
63         scanf("%s%s",s,t);
64         strrev(s);
65         strrev(t);
66         kmp_count();
67     }
68     return 0;
69 }

 

以上是关于hdu 6153的主要内容,如果未能解决你的问题,请参考以下文章

hdu6153 扩展KMP

hdu 6153

hdu6153KMP

HDU 6153 A Secret

HDU 6153 A Secret KMP

2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6153 A Secret KMP,思维