题意:给出一个字符串,求它所有前缀在此字符串中出现的次数。

分析:一看,肯定是kmp中 next[i] 求以下标i-1结尾的字符串,使得最长的(前缀==后缀)的长度。很好想到,当next非零时,肯定和前缀有匹配,自然ans+1。当一个前缀出现多次,当next[j]!=0,ans+1,j=next[j],一直往前跳,直到next[j]为0,如果不为0,ans+1。这里比较难理解,next[i]表示的是长度,当跳一次,长度必然减短,如果这个短的长度的前缀在这个长的中出现了,是不是ans仍然要+1。如aabaab,next{0,0,1,0,1,2,3},当next[i]=2时,跳到下标为2的字符,它对应的next[2]=1,也就是说长度为1的前缀在这个大的长度字符串“aabaa”中出现了,所以ans+1。这只是统计前缀在在后面出现的次数,它自身还没算,所以最中ans+n。

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <string.h>
#include <map>
#include <set>
using namespace std;
#define maxn 200000+5
int Next[maxn];
void getNext(string str)
{int i,j;int len=str.length();Next[0]=Next[1]=0;for(i=1;i<len;i++){j=Next[i];while(str[i]!=str[j]){if(j==0)break;j=Next[j];}if(str[i]==str[j])Next[i+1]=j+1;elseNext[i+1]=0;}
}
int main()
{int ans,t,n,i,j;string str;cin>>t;while(t--){cin>>n;cin>>str;getNext(str);ans=n%10007;int len=str.length();for(i=0;i<=len;i++){j=Next[i];while(j!=0){ans++;ans%=10007;j=Next[j];}}cout<<ans%10007<<endl;}return 0;
}

HGU3336 Count the string (KMP Next数组的应用)相关推荐

  1. HDU 3336 Count the string KMP

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3336 如果你是ACMer,那么请点击看下 题意:求每一个的前缀在母串中出现次数的总和. AC代码: # ...

  2. [HDU3336]Count the string(KMP+DP)

    Solution 不稳定的传送门 对KMP的灵活应用 设dp[i]表示前[1,i]的答案 那么dp[i]=dp[p[i]]+1,p[i]为失配函数 Code #include <cstdio&g ...

  3. C++用string 定义字符串数组

    [cpp] view plaincopy print? #include<iostream> #include<string> using namespace std; #in ...

  4. php自带count 函数,深入理解PHP 数组之count 函数

    count() PHP count() 函数用于计算数组中的单元数目或对象中的属性个数,返回数组的单元个数或对象中的属性个数. 语法: int count( mixed var [, int mode ...

  5. Java char转换为String,String转换为char数组

    Today we will look into java char to String program. We will also learn how to convert String to a c ...

  6. C# String 与 Ushort[] 数组 相互转换

    String To Ushort[]  数组输出 思路:  string  ->  char[] -> byte[] -> byte[2] -> ushort -> us ...

  7. String字符串转数组空格处理

    char数组和String互相转换 String str=" "; //创建一个字符串变量str char[] c; //创建一个字符数组c c = str.toCharArray ...

  8. Java中String与char数组相互转换

    java中对string的操作很多时候不如对char[]操作的方便,所以介绍一些String字符串和char[]互换的方法: String直接转char[] 使用String.toCharArray( ...

  9. kmp——next数组的应用---cout the string

    点击打开链接 这道题的意思是找出每个子串与串的匹配程度,换句话说题意是,给一串字符串,问这串字符串所有的前缀总共在这个字符串中出现了几次.一开始直接想到的事用暴力求解但是算了一下会超时. 其实准确来说 ...

最新文章

  1. R回归模型输出结果详细解读:summary、call、residuals、Coefficients、Assessing Model Fit
  2. 网络推广专员带大家了解网站优化中长尾词的特征与优势!
  3. qt显示rgba8888 如何改 frame_Qt音视频开发2-vlc回调处理
  4. java封装弊端_JAVA-初步认识-第十三章-同步的好处和弊端
  5. 无锁HashMap的原理与实现
  6. JQuery跨站脚本漏洞
  7. 通过java使用ssh访问远程Linux
  8. fpga mysql_FPGA的一些琐碎知识整理
  9. 动态分配方式计算学生成绩
  10. 安全企业 Stormshield 披露数据泄露事件 源代码被盗
  11. 顶点计划家庭感情冲突问题讨论
  12. 数据库事务日志已满的解决办法
  13. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_17-页面查询接口定义-定义模型-需求分析和模型类...
  14. 【算法笔记】初识离散化
  15. Android Banner Indicator 轮播图指示器
  16. Negroni源码分析
  17. windows sevrer2012 dns服务器安装配置
  18. 云服务器端口和防火墙端口配置
  19. 将Oracle的字符集由AMERICAN_AMERICA.ZHS16GBK修改为SIMPLIFIED CHINESE_CHINA.ZHS16GBK
  20. 装完黑苹果怎么装windows_手把手教你轻松安装 Win10/ 黑苹果macOS10.14.1双系统

热门文章

  1. 阿里巴巴内测全网社交产品来往
  2. 【爬虫】一文了解如何处理爬虫中的乱码问题
  3. OC基础语法-1.OC和C语言的对比
  4. 服务器uefi装系统教程,uefi模式怎么重装系统_win10uefi装系统步骤教程
  5. MYSQL对千万级数据的快速迁移(10个G左右)
  6. SDCC 2016·北京站年终收官巨献,五十位演讲嘉宾和议题大公布
  7. linux安装mysql8.0(附安装包)
  8. 卡牌系统psv游戏推荐_《天下HD》荣获App Store首页双位推荐 全新情缘系统盘活游戏社交...
  9. NAO机器人——总结
  10. nao机器人导入自己写的python程序_python程序控制NAO机器人行走