题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3336

题目大意:找出字符串s中和s的前缀相同的所有子串的个数。

题目分析:KMP模板题。这道题考虑 nxt[] 数组的应用。以 s[i] 结尾的子串中一共有多少个子串可以作为s的前缀呢?我们只要令 t = nxt[i],cnt=0

每当 t!=-1,cnt++, t=nxt[t] 就可以了。

当然,我们可以用dp优化,dp[i] = dp[nxt[i]]+1 ,当然,如果 nxt[i]==-1 ,那么 dp[i] 就是 1,因为 s[0...i]

实现代码如下:

#include <cstdio>
#include <string>
#include <iostream>
using namespace std;
#define MOD 10007
const int maxn = 1001000; int T, m, nxt[maxn], ans, f[maxn];
string t; void cal_next() {
m = t.length();
for (int i = 0, j = -1; i < m; i ++) {
while (j != -1 && t[j+1] != t[i]) j = nxt[j];
nxt[i] = (j+1 < i && t[j+1] == t[i]) ? ++j : -1;
}
} void solve() {
ans = 0;
for (int i = 0; i < m; i ++) {
if (nxt[i] == -1) f[i] = 1;
else f[i] = f[nxt[i]] + 1;
ans = (ans + f[i]) % MOD;
}
cout << ans << endl;
} int main() {
scanf("%d", &T);
while (T --) {
cin >> m >> t;
cal_next();
solve();
}
return 0;
}

作者:zifeiy

最新文章

  1. Android 数据库框架OrmLite的使用(一)
  2. JS正则表达式元字符
  3. Install Slax on USB device (Slax U 盘安装)
  4. 【java基础】 如何导入外部jar包
  5. 【Spring学习笔记-1】Myeclipse下Spring环境搭建
  6. (一)CSS三种插入方式
  7. ASP.NET MVC 第七回 UrlHelper
  8. Servlet的一些细节(1)
  9. ls 命令详解
  10. AC日记——字典 codevs 4189
  11. 第23篇 js快速学习知识
  12. 学习的Python教程中的一些问题
  13. word20161229
  14. CF666B. World Tour
  15. pxc5.7配置安装
  16. Codeforces 1073C Vasya and Robot 【二分】
  17. Intellij IDEA快捷键与使用技巧一览表
  18. java 注解默认值
  19. Arrays的排序算法sort及方法使用
  20. NLP--- How to install the tool NLTK in Ubuntu ?

热门文章

  1. pycharm使用gitlab输错密码解决办法
  2. LinqToExcel 简洁与优美开源库
  3. agc015F Kenus the Ancient Greek
  4. Session学习小结
  5. Oracle企业管理框架
  6. 网页性能测试之WebPageTest
  7. nodeJs学习-16 数据字典示例
  8. EasyUI 网格 一主多从 从表使用自定义树状展开
  9. jmeter进行的接口测试和压力测试
  10. hdu2018 dp