Count the string【KMP】

2023-11-18

It is well known that AekdyCoin is good at string problems as well as number theory problems. When given a string s, we can write down all the non-empty prefixes of this string. For example: 
s: "abab" 
The prefixes are: "a", "ab", "aba", "abab" 
For each prefix, we can count the times it matches in s. So we can see that prefix "a" matches twice, "ab" matches twice too, "aba" matches once, and "abab" matches once. Now you are asked to calculate the sum of the match times for all the prefixes. For "abab", it is 2 + 2 + 1 + 1 = 6. 
The answer may be very large, so output the answer mod 10007. 

Input

The first line is a single integer T, indicating the number of test cases. 
For each case, the first line is an integer n (1 <= n <= 200000), which is the length of string s. A line follows giving the string s. The characters in the strings are all lower-case letters. 

Output

For each case, output only one number: the sum of the match times for all the prefixes of s mod 10007.

Sample Input

1
4
abab

Sample Output

6

  这次的KMP求的前面的一个数的总和,前面出现过几次,用一个递推关系即可,如果出现过,就加上前面出现的次数,没出现过的话,就赋值为1,以此递推。


#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
#define INF 0x3f3f3f3f
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int mod = 10007;
const int maxN = 2e5 + 7;
int N, nex[maxN];
char s[maxN];
ll ans, dp[maxN];
void cal_nex()
{
    memset(dp, 0, sizeof(dp));
    nex[0] = nex[1] = 0;
    dp[1] = 1;
    ans = 1;
    int k = 0;
    for(int i=2; i<=N; i++)
    {
        while(k>0 && s[k+1] != s[i]) k = nex[k];
        if(s[k+1] == s[i]) k++;
        nex[i] = k;
        dp[i] = 1;
        if(k) dp[i] += dp[k];
        ans = (ans + dp[i])%mod;
    }
}
int main()
{
    int T; scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &N);
        scanf("%s", s + 1);
        cal_nex();
        printf("%lld\n", ans);
    }
    return 0;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Count the string【KMP】 的相关文章

  • JAVA代码实现字符串匹配(一)——BF、KMP

    话不多说 xff0c 直接进入主题 xff1a 题目描述 xff1a 给定两个字符串text和pattern xff0c 请你在text字符串中找出pattern字符串出现的第一个位置 xff08 下标从0开始 xff09 xff0c 如果
  • 从头到尾彻底理解KMP(2014年8月22日版)

    从头到尾彻底理解KMP 作者 xff1a July 时间 xff1a 最初写于2011年12月 xff0c 2014年7月21日晚10点 全部删除重写成此文 xff0c 随后的半个多月不断反复改进 后收录于新书 编程之法 xff1a 面试和
  • [week15] C - ZJM与纸条(选做)—— KMP算法

    文章目录 题意InputOutput输入样例输出样例提示 分析总结代码 题意 ZJM 的女朋友是一个书法家 xff0c 喜欢写一些好看的英文书法 有一天 ZJM 拿到了她写的纸条 xff0c 纸条上的字暗示了 ZJM 的女朋友 想给 ZJM
  • 9.KMP算法

    KMP算法 1 KMP算法解决的问题 字符串str1和str2 xff0c str1是否包含str2 xff0c 如果包含返回str2在str1中开始的位置 xff0c 如果不包含返回 1 如果做到时间复杂度O N 完成 xff1f 测试用
  • KMP算法详解

    一 什么是KMP算法 KMP主要应用在字符串匹配上 KMP的主要思想是当出现字符串不匹配时 通过已知一部分之前已经匹配的内容 避免从头再去做匹配 所以KMP算法的重点就是如何记录已经匹配的信息 也就是next 数组的实现 二 什么是next
  • Simpsons’ Hidden Talents【KMP模板题】

    Homer Marge I just figured out a way to discover some of the talents we weren t aware we had Marge Yeah what is it Homer
  • 剪花布条 【HDU - 2087】【KMP模板题】

    KMP教学链接 不懂的可以在线问 题意 2个字符串A B 问A中有多少个字符串B Input 输入中含有一些数据 分别是成对出现A B A和B不会超过1000个字符 如果遇见 字符 则表示测试结束 Output 输出B的个数 每个结果之间应
  • KMP算法之基础思想篇

    KMP算法是快速求字符串P 是不是字符串S的子串的一个算法 具体案例呢 可以看力扣的28题 实现 strStr 题意也很简单 就是找出P在S中出现的第一个位置 实际上就是找子串 这种最简单的方法就是暴力 直接两层for循环 O n m 的复
  • 使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile (KMM) 开发

    使用共享 MVI 架构实现高效的 Kotlin Multiplatform Mobile KMM 开发 文章中探讨了 Google 提供的应用架构指南在多平台上的实现 通过共享视图模型 View Models 和共享 UI 状态 UI St
  • 《数据结构》实验报告四:串的模式匹配(BF算法、KMP算法)

    一 实验目的 1 了解串的基本概念 2 掌握串的模式匹配算法的实现 二 实验预习 说明以下概念 1 模式匹配 串的模式匹配就是子串的定位运算 设有两个字符串 S 和 T S为主串 正文串 T为子串 模式串 在主串S中查找与模式串T相匹配的子
  • 求字符串可匹配的最大长度

    如 text abcdlijkfgd query abcdefg 最大匹配为 abcd 为4 编写一个函数 求字符串可匹配的最大长度 如果是完全匹配 则用很多种方法 如BF KMP sunday等字符串匹配算法 KMP是比较常见的 其思想也
  • kmp算法(最简单最直观的理解,看完包会)

    本文将以特殊的方式来让人们更好地理解kmp算法 不包括kmp算法的推导 接下来 我们将从朴素算法出发 在这之前 我们先设主串为S 模式串为T 我们要解决的询问是主串中是否包含模式串 即T是否为S的子串 版权声明 本文为原创文章 转载请标明出
  • C/C++实现strstr函数、KMP算法查找子串

    C C 实现strstr KMP算法查找子串 目录 C C 实现strstr KMP算法查找子串 1 字符串形式 2 字节流形式 1 字符串形式 代码实现 char my strstr const char src const char d
  • 数据结构中Java实现KMP与BF算法对比

    public class KMPANDBF public int indexBfCount SeqString s SeqString t int begin int slen tlen i begin j 0 int count 0 sl
  • LeetCode 1967. 作为子字符串出现在单词中的字符串数目(BM、KMP)

    给你一个字符串数组 patterns 和一个字符串 word 统计 patterns 中有多少个字符串是 word 的子字符串 返回字符串数目 子字符串 是字符串中的一个连续字符序列 示例 1 输入 patterns a abc bc d
  • 【扩展KMP】POJ_3450| HDU_2328 Corporate Identity

    原题直通车 POJ 3450 Corporate Identity HDU 2328 Corporate Identity 题意概述 找出N个串中最长公共子串 分析 一 可以直接枚举其中一个串的所有字串 跟所有串进行匹配找到结果 二 用其中
  • Oulipo

    点击打开链接 Problem Description The French author Georges Perec 1936 1982 once wrote a book La disparition without the letter
  • SDUTOJ KMP简单应用 【KMP】

    KMP简单应用 Time Limit 1000MS Memory limit 65536K 题目描述 给定两个字符串string1和string2 判断string2是否为string1的子串 输入 输入包含多组数据 每组测试数据包含两行
  • 数据结构与算法学习总结(六)——字符串的模式匹配算法

    基本概念 字符串是一种特殊的线性表 即元素都是 字符 的线性表 字符是组成字符串的基本单位 字符的取值依赖于字符集 例如二进制的字符集为0 1 则取值只能为 0 1 再比如英语语言 则包括26个字母外加标点符号 例如 abcde 就是一个字
  • KMP比较简单的讲法。

    转载链接 http blog csdn net yearn520 article details 6729426 我们在一个母字符串中查找一个子字符串有很多方法 KMP是一种最常见的改进算法 它可以在匹配过程中失配的情况下 有效地多往后面跳

随机推荐

  • 问题十:关于application.loadlevel和SceneManager.LoadScene调用后新场景会变暗的问题

    根据百度贴吧的帖子 来到http answers unity3d com questions 919940 applicationloadlevel changes lighting for some rea html 这篇文章说他重新lo
  • Linux与Windows的常见差异

    Linux与Windows的常见差异 一 在Linux上顺理成章 换到Windows上就可能令人费解的事 二 一些Linux的使用技巧 三 一些Windows的使用技巧 一 在Linux上顺理成章 换到Windows上就可能令人费解的事 命
  • chatglm2外挂知识库问答的简单实现

    一 背景 大语言模型应用未来一定是开发热点 现在一个比较成功的应用是外挂知识库 相比chatgpt这个知识库比较庞大 效果比较好的接口 外挂知识库 大模型的方式可以在不损失太多效果的条件下获得数据安全 二 原理 现在比较流行的一个方案是la
  • 带宽和网速的关系是什么

    带宽和网速的关系是什么 带宽和网速的关系是 1Mbps 1024Kbps 1024 8KBps 128KB s 首先 运营商所说的200M宽带光纤 完整单位是200Mbps 而我们电脑中所说的下载速度单位是 MB 因此200M宽带下载速度并
  • ElasticSearch 的配置

    ElasticSearch 的配置 Elasticsearch 的配置同样遵循着 约定大于配置 的设计原则 用户可以选择使用群集更新设置API在正在运行的群集上更改大多数配置 也可以选择通过配置文件对Elasticsearch 进行配置 一
  • WinDbg内核调试命令

    1 查看寄存器 r r eax r gdtr 2 查看pcr pcr 3 查看idt表 idt 转载于 https www cnblogs com fanzi2009 archive 2009 05 27 1491144 html
  • 解决git clone后无法找到文件的问题(通过指定地址)

    今天从github上clone了代码 最后出来形如 但是话说我的东西下载到哪里去了呢 摸不着头脑 然后百度之 发现一般会放在命令行对应的路径下 也就是 win R gt cmd 查看命令行地址 然后去此路径下寻找之 果然在这里 那么 如何才
  • C++知识分享: Socket 编程详解,万字长文

    介绍 Socket编程让你沮丧吗 从man pages中很难得到有用的信息吗 你想跟上时代去编Internet相关的程序 但是为你在调用 connect 前的bind 的结构而不知所措 等等 好在我已经将这些事完成了 我将和所有人共享我的知
  • 解决Echarts默认值为NaN问题

    只需要将echarts的下面属性进行修改就可以了 我们可以在下面代码逻辑中添加自己的逻辑 tooltip trigger item formatter function params if params value return param
  • CSS样式中background-position:后的两个值代表什么?

    如果提供了两个值 第一个会决定距离左边缘的偏移 即水平位置 第二个值会决定图片从上边缘向下的偏移 即竖直的位置 例如 background position 5px 10px 则代表 背景图片向左偏移5px 向下偏移 10px
  • [创业-37]:公司的组织架构--所有者与决策机构(股东)

    目录 第1章公司的组织架构 1 1 什么是公司的组织架构 1 2 公司组织架构的类型 第2章 典型的上司公司组织架构 2 1 股东大会 2 2 董事会 2 3 监事会 2 4 总经理 补充 创始人 董事长 CEO 总裁 总经理的区别 第1章
  • PAT2-回形取数

    回形取数 qdulq 40 分 回形取数就是沿矩阵的边取数 若当前方向上无数可取或已经取过 则左转90度 一开始位于矩阵左上角 方向向下 输入格式 输入第一行是两个不超过200的正整数m n 表示矩阵的行和列 接下来m行每行n个整数 表示这
  • CSS 层叠上下文(Stacking Context)

    在网页制作的过程中 元素与元素之间的位置关系 在坐标轴上一般可体现为 X 轴 Y 轴和 Z 轴 对于 X 轴和 Y 轴的定位大多数开发都能比较直观的搞清楚 而 Z 轴 则相对较为模糊 或者说不能全面的理解Z轴的显示逻辑 大多数人都知道可以使
  • springboot 配置文件中属性变量引用方式@@解析

    这种属性应用方式是field name field value 两个 符号是springboot为替代 属性占位符产生 原因是 会被maven处理 所以应该是起不到引用变量的作用 方式可以引用springboot非默认配置文件 即其他配置文
  • 【01】OpenCV模块架构介绍+示例程序演示

    本系列文章是基于Windows下 结合Visual Studio2017和OpenCV4 7进行编写 使用C 代码进行演示 目录 1 OpenCV模块架构 2 示例程序效果展示 2 0创建工程 2 1边缘检测示例edge cpp 2 2K聚
  • 求学在卡梅

    卡内基梅隆大学坐落在美国宾夕法尼亚州匹兹堡市 对于卡梅 我同样慕名已久 清华大学的计算机学科在国内名列前茅 而卡内基梅隆大学计算机学院下属计算机 机器人和语言工程等几个系 和麻省理工 斯坦福 伯克利一起在计算机领域排名第一 1999年8月
  • 纯新手入门机器/深度学习自学指南(附一个月速成方案)

    原作 Masum Hasan问耕 编译整理量子位 出品 公众号 QbitAI 怎么入门机器 深度学习 回答这个问题 最先要考虑的问题是 你有多少时间 准备用三个月入门 和想要一个月速成 肯定是截然不同的路径 当然我建议大家稳扎稳打 至少可以
  • 如何解决K8S节点显示NotReady

    文章目录 kubernetes节点断电重启 kubernetes节点断电重启 背景 运行的好好的k8s集群 某天断电 发现一个节点炸了 显示NotReady kubectl get nodes 那么如何查找问题呢 我们用它 journalc
  • 如何在移动端猎豹浏览器中设置代理IP

    手机浏览器作为一款功能强大且广受欢迎的移动浏览器 提供了丰富的功能和个性化选项 其中包括设置动态ip地址的功能 通过设置动态ip地址 您可以改变您的网络访问路径 保护个人隐私 或者访问被地理限制的内容 接下来 我将为您介绍在手机浏览器中如何
  • Count the string【KMP】

    It is well known that AekdyCoin is good at string problems as well as number theory problems When given a string s we ca