题意:

      给你一个串,问你他的所有前缀子串在本串中的出现次数,注释:abc的前缀子串是

a ab abc;

思路:

     还是利用了next数组,先对子串求出next数组,再开一个数组dp,初始化全是1,因为每个以当前i结尾的都至少是1,然后从后往前更新,把以i结尾的加到以next[i]结尾的上,

运用的next数组的特点相当于 123123123 最后一个3加到倒数第二个3,倒数第二个3再加到第一个3 那么以3结尾的(123)出现了三次,以3结尾的(123123)出现了两次,以3结尾的(123123123) 出现了一次。

例子详细数据: 

原串   123123123

next   000123456

  dp   333222111

提示:

    这个题目的串之间是可以交叉的,但不可以完全重叠,比如对与这个题目11111的答案是15.


#include<stdio.h>
#include<string.h> #define N 200000 + 100

char
str[N];
int
next[N];
int
dp[N]; void get_next(int m)
{
int
j ,k;
j = 0 ,k = -1;
next[0] = -1;
while(
j < m)
{
if(
k == -1 || str[j] == str[k])
next[++j] = ++k;
else
k = next[k];
}
return ;
} int main ()
{
int
t ,m ,i;
scanf("%d" ,&t);
while(
t--)
{

scanf("%d" ,&m);
scanf("%s" ,str);
get_next(m);
for(
i = 1 ;i <= m ;i ++)
dp[i] = 1;
int
sum = 0;
for(
i = m ;i >= 1 ;i --)
{
if(
next[i])
{

dp[next[i]] += dp[i];
dp[next[i]] %= 10007;
}

sum += dp[i];
sum %= 10007;
}

/*
for(i = 1 ;i <= m ;i ++)
printf("%d " ,next[i]);
printf("\n");
for(i = 1 ;i <= m ;i ++)
printf("%d " ,dp[i]);
printf("\n");
*/
printf("%d\n" ,sum);
}
return
0;
}

hdu3336 KMP + DP 前缀数组出现的次数的更多相关文章

  1. 转载-KMP算法前缀数组优雅实现

    转自:http://www.cnblogs.com/10jschen/archive/2012/08/21/2648451.html 我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见 ...

  2. POJ-2752(KMP算法+前缀数组的应用)

    Seek the Name, Seek the Fame POJ-2752 本题使用的算法还是KMP 最主要的片段就是前缀数组pi的理解,这里要求解的纸盒pi[n-1]有关,但是还是需要使用一个循环来 ...

  3. HDU3336 KMP+DP

    Count the string Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. poj 2046&&poj1961KMP 前缀数组

    Power Strings Time Limit: 3000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Jav ...

  5. 求最长公共前缀和后缀—基于KMP的next数组

    KMP算法最主要的就是计算next[]算法,但是我们知道next[]求的是当前字符串之前的子字符串的最大前后缀数,但是有的时候我们需要比较字符串中前后缀最大数,比如 LeetCode的shortest ...

  6. codeforces432D Prefixes and Suffixes(kmp+dp)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud D. Prefixes and Suffixes You have a strin ...

  7. HDU 6153 A Secret ( KMP&&DP || 拓展KMP )

    题意 : 给出两个字符串,现在需要求一个和sum,考虑第二个字符串的所有后缀,每个后缀对于这个sum的贡献是这个后缀在第一个字符串出现的次数*后缀的长度,最后输出的答案应当是 sum % 1e9+7 ...

  8. POJ 3336 Count the string (KMP+DP,好题)

    参考连接: KMP+DP: http://www.cnblogs.com/yuelingzhi/archive/2011/08/03/2126346.html 另外给出一个没用dp做的:http:// ...

  9. hdu3336 kmp

    It is well known that AekdyCoin is good at string problems as well as number theory problems. When g ...

随机推荐

  1. js 前端MD5加密

    1.引入 <script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script& ...

  2. MySQL数据库插入数据出现 ERROR 1526 (HY000): Table has no partition for value xxx

    MySQL数据库插入数据出现ERROR 1526 (HY000): Table has no partition for value xxx工作的时候发现无法插入数据,报错:ERROR 1526 (H ...

  3. WPF 应用 - 使用 Properties.Settings 保存客户端密码

    1. 先在项目的 Settings.settings 新建需要的字段和类型 有需要还可设置初始默认值 2. 启动客户端时,获取 Properties.Settings 的属性值 public void ...

  4. httpd解析PHP

    1.vim /usr/local/apache2.4/conf/httpd.conf 编辑httpd的主配置文件 搜索ServerName,把ServerName www.example.com:80 ...

  5. 解析库--XPath

    from lxml import etree 2 text = ''' 3 <div> 4 <ul> 5 <li class = "item-0"&g ...

  6. 练习1—参数传递、递归调用(Java)

    1.方法参数的值传递机制 1.说明 方法:必须由其所在类或对象调用才有意义.若方法含有参数: 形参:方法声明时的参数: 实参:方法调用时实际传给形参的参数值 Java的实参值如何传入方法:Java里方 ...

  7. 模拟实现AMD模块化规范

    目录 引子 再谈什么是闭包(闭包的产生)? 词法作用域 回到闭包 利用闭包编写模块 实现AMD模块化规范 写在最后 引子 本文最后的目的是模拟实现AMD模块化规范,而写下本文的原因是今天阅读到了< ...

  8. python-3-3 字典

    一 元组(tuple) 1.元组也是一个list,他和list的区别是 元组里面的数据无法修改 元祖用()小括号表示,如果元祖里面只有一个元素的话,必须在这个元素的后面添加一个逗号,不然就不是元祖了 ...

  9. CobaltStrike 和 Metasploit 联动

    出品|MS08067实验室(www.ms08067.com) 本文作者:掉到鱼缸里的猫(Ms08067内网安全小组成员) 个人觉得CobaltStrike图形化的界面和丰富的功能,是一个超强的后渗透框 ...

  10. Edge 浏览器开发工具新增了 3D 视图,你尝试了吗?

    在使用开发者工具的时候,无意间发现了一个3D面板,如下: 仔细想想,这应该是之前 Firefox 的特性啊,不过后来去掉了,说是太难维护,没想到 Edge 也添加了这个特性. 使用该特性,你可以完成如 ...