分析转自:http://972169909-qq-com.iteye.com/blog/1114968

十分易懂

题意:求字串中【前缀+跟前缀相同的子串】的个数?

Sample Input

1

4

abab

Sample Output

6

abab:包括2个a,2个ab,1个aba,1个abab

这里要用到next值的意义:

next[i]表示前i个字符所组成的字符串的最大前后缀匹配长度

举个例子:



next[5]=2, 表示下标5前面那个字符串abcab的前后缀匹配的最大长度是2,显然就是ab了

回到本题:

所求=字串的前缀个数+与前缀相同的子串

问题可以部分转化为:每个前缀的最大前后缀匹配问题

继续用上面的例子:

第一步:



对于这段子串,next[5]=2,然后后面不符合next值的递推规律了

所以对于abcab,长度为2的后缀,即ab与前缀匹配

所以+1个ab,注意还要+1个a,既然后缀ab跟前缀ab匹配,则必有a跟前缀匹配

也就是+2个了,其实实际上+next[5]就可以了,因为这是最长前后缀匹配长度

第二步:



对于这段子串:

next[6]=1,然后后面不符合next值的递推规律了

所以对于abcaba,长度为1的后缀,即a与前缀匹配

所以+1个a,也就是+next[6]了

第三步:



对于整个串:

next[12]=4后面没有了

所以对于整个串:abcabacbabca,长度为4的后缀跟前缀匹配

所以+1个abca,+1个abc,+1个ab,+1个a,总共+4个,也就是+next[12]了

最后:

好了,刚刚一共+了7个与前缀匹配的子串

上面说了题目是求:字串的前缀个数+与前缀相同的子串个数

与前缀相同的子串个数就是7个了

然后字串的前缀个数当然就是整个串的长度了,那么就是12个

加起来就是答案:19

以前代码错了居然也能A,这数据。。。

 #include<stdio.h>
#include<string.h>
const int MAXN=;
const int MOD=;
int dp[MAXN];
char str[MAXN];
int next[MAXN]; void getNext(char *p)
{
int j,k;
j=;
k=-;
next[]=-;
int len=strlen(p);
while(j<len)
{
if(k==-||p[j]==p[k])
{
j++;
k++;
next[j]=k;
}
else k=next[k];
}
}
int main()
{
int T;
int n;
//freopen("1.in","r",stdin);
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
scanf("%s",&str);
getNext(str);
dp[]=;
int ans=;
for(int i=;i<=n;i++)
{
if(next[i]) ans++;
ans%=MOD;
}
ans+=n;
ans%=MOD;
printf("%d\n",ans);
}
return ;
}

hdu 3336 kmp+next数组应用的更多相关文章

  1. HDU 3336 KMP

    题意:求每一个前缀,跟前缀相同的每个子串. 此题:网上很多都是假程序,不过也AC了,的确我测试几个案例之后的的确确是存在这个问题. 分析:每一个前缀,可以考虑KMP,f失配指针,如何求得它出现了多少次 ...

  2. HDU 3336 (KMP next性质) Count the string

    直接上传送门好了,我觉得他分析得非常透彻. http://972169909-qq-com.iteye.com/blog/1114968 #include <cstdio> #includ ...

  3. HDU 3336 Count the string(KMP的Next数组应用+DP)

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

  4. HDU 1358 Period(KMP next数组运用)

    Period Problem Description For each prefix of a given string S with N characters (each character has ...

  5. hdu poj KMP简单题目总结

    hdu 3336 题意:输入一个字符串求每个前缀在串中出现的次数和 sol:只要稍微理解下next 数组的含义就知道只要把每个有意义的next值得个数加起来即可 PS:网上有dp解法orz,dp[i] ...

  6. hdu 1686 KMP模板

    // hdu 1686 KMP模板 // 没啥好说的,KMP裸题,这里是MP模板 #include <cstdio> #include <iostream> #include ...

  7. hdu 4638 树状数组 区间内连续区间的个数(尽可能长)

    Group Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. hdu 4777 树状数组+合数分解

    Rabbit Kingdom Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. Cyclic Nacklace HDU 3746 KMP 循环节

    Cyclic Nacklace HDU 3746 KMP 循环节 题意 给你一个字符串,然后在字符串的末尾添加最少的字符,使这个字符串经过首尾链接后是一个由循环节构成的环. 解题思路 next[len ...

随机推荐

  1. get_magic_quotes_gpc函数

    magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post.get.cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊 ...

  2. 突破XSS字符数量限制执行任意JS代码

    一.综述 有些XSS漏洞由于字符数量有限制而没法有效的利用,只能弹出一个对话框来YY,本文主要讨论如何突破字符数量的限制进行有效的利用,这里对有效利用的定义是可以不受限制执行任意JS.对于跨站师们来说 ...

  3. SpringMVC 和Struts2的区别

    SpringMVC 和Struts2的区别 1. 机制: spring mvc的入口是servlet,而struts2是filter,这样就导致了二者的机制不同. 2. 性能: spring会稍微比s ...

  4. dos 下 查看和设置classpath的命令

    dos 下  查看和设置classpath的命令查看:echo %classpath%设置:set classpath=%classpath%path   其中%classpath%代表以前的值,pa ...

  5. 12个常用的js正则表达式

    在这篇文章里,我已经编写了12个超有用的正则表达式,这可是WEB开发人员的最爱哦. 1.在input框中只能输入金额,其实就是只能输入最多有两位小数的数字 //第一种在input输入框限制 <i ...

  6. python闭包小例子

    ------------------ 首先根据实例, 体会一下闭包的效果 ------------------ 定义闭包: def foo(x): a = [0] def bar(y): a[0] = ...

  7. PHP访问,增删改查,小结

    PHP访问数据,增,删,改,查 增: 1,add.php 显示页面,利用 <form> 表单添加数据,数据添加到 name 中. 2,addchuli.php 处理页面,定义变量接受 $_ ...

  8. ruby开发过程中的小总结

    (1)建表的时候注意保留字 在新建的表里无法插入一列的值, 报错信息是:Can't mass-assign protected attributes,这一列的列名是type,查了一下发现是因为type ...

  9. BestCoder Round #60 1002

    Problem Description You are given two numbers NNN and MMM. Every step you can get a new NNN in the w ...

  10. Linux的watch命令 — 实时监测命令的运行结果

    Linux的watch命令 — 实时监测命令的运行结果 watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一样,watch 可以帮你监测一个命令的运行结果,省得 ...