题目大意:

找到字符串中所有和前缀字符串相同的子串的个数

对于这种前缀的问题,通常通过扩展kmp来解决

其实吧这是我第一次做扩展kmp的题目,原来确实看过这个概念,今天突然做到,所以这个扩展kmp的模板是做到这道题直接copy的

这里用扩展kmp很好解决问题,_next[i],表示第i位开始所能匹配到的最大公共前缀长度,比如说这个长度为4,那么说明前缀1,2,3,4都出现了一次,我们只在cnt[4]++

那么最后从n到1,逆向更新cnt[i] += cnt[i+1]即可,最后得到cnt[i]就表示前缀长度为i的时候所能得到的相同的子串的个数

 #include <cstdio>
#include <iostream>
#include <cstring> using namespace std;
#define N 200005
#define MOD 10007
char s[N];
int _next[N] , cnt[N]; void get_next(char *T){// _next[i]: 以第i位置开始的子串 与 T的公共前缀
int i,length = strlen(T);
_next[] = length;
for(i = ;i<length- && T[i]==T[i+]; i++);
_next[] = i;
int a = ;
for(int k = ; k < length; k++){
int p = a+_next[a]-, L = _next[k-a];
if( (k-)+L >= p ){
int j = (p-k+)>? (p-k+) : ;
while(k+j<length && T[k+j]==T[j]) j++;// 枚举(p+1,length) 与(p-k+1,length) 区间比较
_next[k] = j, a = k;
}
else _next[k] = L;
}
}
int main()
{
// freopen("a.in" , "r" , stdin);
int T;
scanf("%d" , &T);
while(T--)
{
int n;
scanf("%d%s" , &n , s);
get_next(s);
// for(int i=0 ; i<n ; i++) cout<<_next[i]<<endl;
memset(cnt , , sizeof(cnt));
for(int i= ; i<n ; i++) cnt[_next[i]]++;
for(int i=n- ; i>= ; i--) cnt[i]+=cnt[i+];
int sum=;
for(int i= ; i<=n ; i++) sum = (sum+cnt[i])%MOD;
printf("%d\n" , sum);
}
return ;
}

HDU 3336 扩展kmp的更多相关文章

  1. hdu 4333 扩展kmp+kmp重复字串去重

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 关于kmp next数组求最短重复字串问题请看:http://www.cnblogs.com/z ...

  2. hdu 4333(扩展kmp)

    题意:就是给你一个数字,然后把最后一个数字放到最前面去,经过几次变换后又回到原数字,问在这些数字中,比原数字小的,相等的,大的分别有多少个.比如341-->134-->413-->3 ...

  3. HDU 6153 扩展kmp

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others)Total ...

  4. HDU 3613 扩展KMP

    暴力枚举大水题,判断回文,扩展KMP #include <cstdio> #include <cstring> #include <algorithm> using ...

  5. HDU 2594 扩展kmp模板题

    题目大意: 给定两个字符串,在第一个字符串中找到一个最大前缀作为第二个字符串的后缀 #include <iostream> #include <cstdio> #include ...

  6. hdu 3613 扩展kmp+回文串

    题目大意:给个字符串S,要把S分成两段T1,T2,每个字母都有一个对应的价值,如果T1,T2是回文串(从左往右或者从右往左读,都一样),那么他们就会有一个价值,这个价值是这个串的所有字母价值之和,如果 ...

  7. HDU 6153 A Secret(扩展KMP模板题)

    A Secret Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 256000/256000 K (Java/Others) Total ...

  8. 扩展KMP --- HDU 3613 Best Reward

    Best Reward Problem's Link:   http://acm.hdu.edu.cn/showproblem.php?pid=3613 Mean: 给你一个字符串,每个字符都有一个权 ...

  9. HDU 4333 Revolving Digits 扩展KMP

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4333 题意:给以数字字符串,移动最后若干位到最前边,统计得到的数字有多少比原来大,有多少和原来同样,有多少 ...

随机推荐

  1. Java Ant build.xml详解

    1,什么是antant是构建工具2,什么是构建概念到处可查到,形象来说,你要把代码从某个地方拿来,编译,再拷贝到某个地方去等等操作,当然不仅与此,但是主要用来干这个3,ant的好处跨平台   --因为 ...

  2. Mysql中的排序规则utf8_unicode_ci、utf8_general_ci的区别总结

    Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...

  3. D3.js 第一个程序 HelloWorld

    一.HTML 是怎么输出 HelloWorld 的 <html> <head> <meta charset="utf-8"> <title ...

  4. Android控件_使用TextView实现跑马灯效果

    一.第一种方式: 通过TextView控件的自身属性实现(但是有缺点就是当多个TextView要实现这种效果的时候,只有第一个才有效果)  实现方法加上下面四个属性: android:singleLi ...

  5. Linux计划任务Crontab实例详解教程

    说明:Crontab是Linux系统中在固定时间执行某一个程序的工具,类似于Windows系统中的任务计划程序 下面通过详细实例来说明在Linux系统中如何使用Crontab 操作系统:CentOS ...

  6. C++疑难杂症

    1.如果在类成员函数外部显示的调用其父类的某个接口. 2.对于一个父类的成员, 子类如何在构造函数中对其进行特殊的定制生成. 3.对于一个需要用常量来声明的类型, 如何定义这个常量.   比如int ...

  7. 添加SSH密钥到GitHub

    $ clip < ~/.ssh/id_rsa.pubbash: /c/Users/UsersName/.ssh/id_rsa.pub: No such file or directory [转] ...

  8. 《javascript高级程序设计》 第25章 新兴的API

    25.1 requestAnimationFrame() 25.1.1 早期动画循环 25.1.2 循环间隔的问题 25.1.3 mozRequestAnimation-Frame.webkitReq ...

  9. 笔记8:winfrom连接数据库DBHelp

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  10. MyBatis执行过程显示SQL语句的log4j配置

    log4j.properties文件   log4j.rootLogger=debug,stdout,logfile log4j.appender.stdout=org.apache.log4j.Co ...