C 题 KMP中next[]问题

题目大意:

找到能够进行字符串匹配的前缀

这题只要一直求next,直到next为0停止,记得答案是总长减去next的长度

 1 #include <iostream>
 2 #include <cstdio>
 3 #include<string>
 4 using namespace std;
 5
 6 #define N 1000100
 7 int a[N],b[N],next[N];
 8 int m;
 9 void getNext(){
10     next[0]=0;
11     next[1]=0;
12     for(int i=1;i<m;i++){
13         int j=next[i];
14         while(b[j]!=b[i]&&j) j=next[j];
15         if(b[j]==b[i]) next[i+1]=j+1;
16         else next[i+1]=0;
17     }
18 }
19
20 int main()
21 {
22     int T,count;
23     cin>>T;
24     string s;
25     for(int i=1;i<=T;i++){
26         cin>>s;
27         m=s.length(),count=0;
28         int t=m;
29         for(int k=0;k<m;k++) b[k]=s.at(k);
30         getNext();
31         //a[count++]=m;
32
33         while(next[m])
34         {
35             a[count++]=t-next[m];
36             m=next[m];
37         }
38         cout<<"Case #"<<i<<": "<<count+1<<endl;
39         for(int i=0;i<count;i++) cout<<a[i]<<‘ ‘;
40         cout<<t<<endl;
41     }
42     return 0;
43 }

C 题 KMP中next[]问题

时间: 2024-10-03 23:59:02

C 题 KMP中next[]问题的相关文章

经典算法题每日演练——第七题 KMP算法

原文:经典算法题每日演练--第七题 KMP算法 在大学的时候,应该在数据结构里面都看过kmp算法吧,不知道有多少老师对该算法是一笔带过的,至少我们以前是的, 确实kmp算法还是有点饶人的,如果说红黑树是变态级的,那么kmp算法比红黑树还要变态,很抱歉,每次打kmp的时候,输 入法总是提示“看毛片”三个字,嘿嘿,就叫“看毛片算法”吧. 一:BF算法 如果让你写字符串的模式匹配,你可能会很快的写出朴素的bf算法,至少问题是解决了,我想大家很清楚的知道它的时间复 杂度为O(MN),原因很简单,主串和模

POJ 2752 KMP中next数组的理解

感觉这里讲的挺好的.http://cavenkaka.iteye.com/blog/1569062 就是不断递归next数组.长度不断减小. 题意:给你一个串,如果这个串存在一个长度为n的前缀串,和长度为n的后缀串,并且这两个串相等,则输出他们的长度n.求出所有的长度n. 思路:KMP中的get_next().对前缀函数next[]又有了进一步的理解,str[1]~~str[next[len]]中的内容一定能与str[1+len-next[len]]~~str[len]匹配(图1).然后呢我们循

平衡树24题(更新中…)

平衡树24题(更新中-) 前言: 我写的平衡树题里不是用Treap解决的,就是用Fhq-Treap写的,还有极少数是用Splay写的. 说说这几个树的区别与优劣: Treap是编码相对来说最容易的,但是由于它的结构不能改变,以致许多题目不能实现,区间操作也不行.一般来说,Treap可以打裸题,或者作为其它算法的辅助算法. Fhq-Treap一般来说Splay能做的它都可以.编码比Splay容易,容易理解.功能强大.唯一不足的是在LCT没有Splay优秀. Splay很灵活,一般所有情况都可以处理

4种字符串匹配算法:BS朴素 Rabin-karp 有限自动机 KMP(中)

接着上文(地址),我们来聊一聊自动机算法(有限自动机字符串匹配算法)和KMP算法. ====#=有限自动机算法=#===== 关于有限自动机,网上的分析的资源,大部分都很笼统,算导上的知识点,全是数学公式,看的也会特别累.因此,打算从算导的第一题开始讲起.从习题入手,讲这个算法的思想. 例子:对模式 P = aabab构造出相应的字符串匹配自动机,并说明它在文本字符串T=aaababaabaababaab上的操作过程. 再讲这个例子之前,我们有必要先来了解一下自动机是什么意思? 有限自动机是什么

ACM做题过程中的一些小技巧

1.一般用C语言节约空间,要用C++库函数或STL时才用C++; cout.cin和printf.scanf最好不要混用. 2.有时候int型不够用,可以用long long或__int64型(两个下划线__). 值类型表示值介于 -2^63 ( -9,223,372,036,854,775,808) 到2^63-1(+9,223,372,036,854,775,807 )之间的整数. printf("%I64d",a); printf("%lld",a); 3.O

2016年上半年系统分析师上午真题(中)

 要想把握住考试出题方向,做真题是最直接也是最有效的方法.下面希赛软考学院为您整理了2016年上半年系统分析师上午试题,准备参加2017年系统分析师考试的朋友,不要错过了.  2016年上半年系统分析师考试上午真题(26-50题)  ●对信息系统进行建模,其目的是为了获得对系统的框架认识和概念性认识.以下关于建模方法的叙述中,正确的是().  (27)A.领域模型描述系统中的主要概念.概念的主要特征及其之间的关系  B.用例模型描述了一组用例.参与者以及它们之问的关系  C.IPO图将系统与外界

2016年上半年信息系统监理师考试上午真题(中)

参加软考的信息系统监理师考试且成绩合格是申请信息系统监理工程师初始登记的基本要求之一,要想获得信息系统监理工程师证书,就必须参加考试.下面希赛软考学院为您整理了2016年上半年信息系统监理师考试上午真题,助您考试一臂之力. 2016年上半年信息系统监理师考试上午真题(26-50题) ●需求分析说明书不能作为(26). A.可行性研究的依据 B.用户和开发人员之间的约定 C.系统概要设计的依据 D.软件验收测试的依据 ●数据流程图(DataFlowDiagram,DFD/DataFlowChart

python每日经典算法题5(基础题)+1(中难题)

现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级函数的应用.这些题目是在某些刷题的网站上登记的有水平的题目.这里如果有需要input的简单题,就略去了输出结果.如果时间充裕,则就会增加每日更多习题. 一:基础算法题10道 1.判断用户输入的年份是否为闰年 题目解析: (1)问题分析:能被4整除但不能被100整除的年份为普通闰年,能被400整除的年

leetcode 第184场周赛第一题(数组中的字符串匹配)

一.函数的运用 1,strstr(a,b); 判断b是否为a的子串,如果是,返回从b的开头开始到a的结尾 如“abcdefgh” “de” 返回“defgh”: 如果不是子串,返回NULL: 2,memcpy(a,b+n,c); 将b串从第n位后的c个字符串复制到a中,返回a串: (注:做完函数后需要添加上b[c] = '\0') 如果吧b+n换成b就是从头开始 将代码换成 memcpy(arr[cnt], words[i], strlen(words[i])+1); 就是直接复制words[i