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

题意求字符串的每个后缀与原串的最长公共前缀之和。

比赛时搞东搞西的,还搞了个后缀数组...队友一说扩展kmp我都自闭了,这不就是扩展kmp的第一步,求原串的每个后缀与原串的最长公共前缀嘛。

需要注意的就是题目准确问的是按照文中所给的代码执行需要判断几次,如果最长公共前缀等于该后缀的长度,则会判断Next[i]次(Next[i]为以i为开始的后缀与原串的最长公共前缀)。如果不等,则会判断Next[i]+1次,因为会判断一次失配。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<algorithm>
 6 using namespace std;
 7 typedef long long ll;
 8 const int maxn = 1e6 + 10;
 9 int Next[maxn];
10 void getN(char *s1) {//求子串与自身匹配
11     int i = 0, j, p, len = strlen(s1);
12     Next[0] = len;
13     while (i + 1 < len&&s1[i] == s1[i + 1])
14         i++;
15     Next[1] = i;
16     p = 1;
17     for (i = 2; i < len; i++) {
18         if (Next[i - p] + i < Next[p] + p)
19             Next[i] = Next[i - p];
20         else {
21             j = Next[p] + p - i;
22             if (j < 0)
23                 j = 0;
24             while (i + j < len&&s1[j] == s1[i + j])
25                 j++;
26             Next[i] = j;
27             p = i;
28         }
29     }
30 }
31 char s[maxn];
32 int main() {
33     int t;
34     scanf("%d", &t);
35     while (t--) {
36         scanf("%s", s);
37         int n = strlen(s);
38         getN(s);
39         long long ans = 0;
40         for (int i = 1; i < n; ++i) {
41             if (Next[i] == n - i) ans += n - i;
42             else ans += Next[i] + 1;
43         }
44         printf("%lld\n", ans);
45
46     }
47 }

转载于:https://www.cnblogs.com/sainsist/p/11354745.html

[2019杭电多校第五场][hdu6629]string matching(扩展kmp)相关推荐

  1. 2019杭电多校 第七场 Kejin Player 6656(求期望值)

    2019杭电多校 第七场 Kejin Player 6656(求期望值) 题目 http://acm.hdu.edu.cn/showproblem.php?pid=6656 题意 给你n,q.表示有n ...

  2. 2019杭电多校第9场1002 Rikka with Cake HDU6681

    2019杭电多校第9场1002 Rikka with Cake HDU6681 题意:给你若干个点按上下左右切割平面,最后问平面内有几块被切割开来. 解法1:红黑树+思维+贪心 A:根据欧拉定理可以得 ...

  3. 【2019.08.21】2019杭电多校第十场

    补题地址:http://acm.hdu.edu.cn/listproblem.php?vol=58 题号:6691-6701 1001: 1002: 1003:✅ 1004: 1005:✅ 1006: ...

  4. 2019 杭电多校第六场 题解

    比赛记录 注意随机数据 ,1-n排列这种,一般都有啥暴力重构之类的方法,期望重构次数很少之类的 1005也是这样,因为n^2但只有n个值有数,所以就可以n^2logn 题解 1001 Salty Fi ...

  5. 2019杭电多校第三场 6608 Fansblog(威尔逊定理+miller_rabin素性测试)

    Problem Description 传送门 Farmer John keeps a website called 'FansBlog' .Everyday , there are many peo ...

  6. 2019 杭电 多校第3场 1006 Fansblog (HDU 6608)

    题目链接 题解: 用威尔逊定理变换,然后求逆元. 代码: #include <bits/stdc++.h> using namespace std; typedef long long l ...

  7. hdu 6656 2019杭电多校第7场 期望题

    设f[i]为从i升级到i+1期望需要的金钱,由于每级都是能倒退或者升级到i+1,所以询问从l,r的期望金钱可以直接前缀和,那么推导每一级升级需要的期望钱也可以用前缀和推导 设sum[i]=f[1]+f ...

  8. 2019杭电多校第7场 K Kejin Player HDU 6656(数学推导)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6656 题目大意:对于每一个等级,可以花ai元,有pi概率升级,如果升级失败就退到xi级,问从li级升到 ...

  9. 2019杭电多校第七场 HDU - 6656 Kejin Player 期望

    题目链接:https://vjudge.net/problem/HDU-6656 题解: 维护一个前缀sum[i] : 从1到 i 的期望 第 i 到达 i + 1是:ai + (1 - r[i] / ...

  10. 2019杭电多校第七场 HDU - 6656 Kejin Player——概率期望

    题意 总共有 $n$ 层楼,在第 $i$ 层花费 $a_i$ 的代价,有 $pi$ 的概率到 $i+1$ 层,否则到 $x_i$($x_i \leq 1$) 层.接下来有 $q$ 次询问,每次询问 $ ...

最新文章

  1. 支持向量机SVM序列最小优化算法SMO
  2. .netcore部署到IIS上出现HTTP Error 502.5 - Process Failure问题解决
  3. 生成pfx文件需要在服务器上执行,PEM文件和private.key文件生成IIS服务器所需的pfx文件(配置SSL用)...
  4. java 写文件缓存,java泛型实现文件缓存
  5. LabView中,下拉列表和枚举有什么区别?
  6. Vue-Less的自动和手动引入
  7. ubuntu下设置Android手机驱动
  8. 理解VMware资源池
  9. 游戏外挂检测和反检测
  10. C++泛型编程——迭代器
  11. C语言结构体,共用体所占字节数计算
  12. 区间对比_预算10-15万元区间 国内在售街车综合实力对比
  13. php header 转向,php使用header函数的http头设置大全(包含301转向及404状态)
  14. java: 未报告的异常错误org.json.JSONException; 必须对其进行捕获或声明以便抛出
  15. java成绩五分制转换_绩点五分制换算(5分制的绩点对照表)
  16. google android模拟器多系统,Android模拟器安装教程_体验google_Android系统手机
  17. 英语app二维码及图标
  18. 关系型数据库与非关系型数据库的简介、对比和说明!!!
  19. 【Web技术】1008- coding优雅指南:函数式编程
  20. 单片机C语言C51的输入输出

热门文章

  1. 利用R语言的Boruta包进行特征选择
  2. 如何七周成为数据分析师
  3. 2018科大讯飞AI营销算法大赛总结(冠军)
  4. Abp框架多租户源码解读
  5. 企业组织形态及财务报表
  6. 都昌时间轴控件功能说明
  7. 开发自己的工作流(一)
  8. 工作中一些环境问题解决记录
  9. border做三角符号
  10. 使用submit异步提交,阻止表单默认提交