Poj--2406(KMP,周期)

2014-12-12 23:55:35

思路:时隔半年,终于通过Matrix67的文章搞懂KMP了,orz。。。

  这题加深了我对KMP本质的了解,题目让你求的是最长周期串的长度。

  仔细考虑,我们发现get_P过程(就是另一种写法里的get_next),就是一种自我匹配找周期的过程!

  【观察abcabcabc,P[9]=6,P[6]=3,P[3]=0,而且s[9]=s[6]=s[3],再者P[9]是从P[8]转移来的,换句话说是从P[6]转移过来的,P[6]=3说明包含s[6]在内的3个字符(s[3]->s[6])与头3个字符相等,而P[6]=6说明包含s[9]在内的6个字符(s[3]->s[9])与头6个字符相等。思考:P[6]说明abc这个周期重复2次,而P[9]说明abc这个周期重复了3次!

  所以P可以理解为最大周期包含串长度(自己YY的玩意),abcabcabc的P[9]=6可以理解为前(9-6=3)个字符为周期,然后P[9]=6意思是以s[9]为终点的串包含了6个字符(也就是两个周期),我们命名这个串为周期包含串;再来个更普通的例子:abcabcab,P[8]=5,理解为前(8-5=3)个字符为周期,然后P[8]=5的意思是以s[8]为终点的周期包含串包含了5个字符,我们发现5个字符不是完整的两个周期,没错,差一个字符,回过去观察,的确差一个c才能形成两个周期。也就是说P[8]=5包含着以s[8]为终点的周期包含串正在形成第二个周期,但还没完成。

  最后一个例子:abcbcabc,P[8]=3,理解为以s[8]为终点的周期包含串已经有了3个字符,但我们来看看周期是什么:8 - 3 = 5,也就是s[1]->s[5] : abcbc,显然P[8]还没包含一整个周期。以上解释纯属个人看完Matrix67文章后对本题的些许理解,望纠正与交流。】

 1 /*************************************************************************
 2     > File Name: 2406.cpp
 3     > Author: Natureal
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Fri 12 Dec 2014 10:30:00 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 typedef unsigned long long ull;
26 const int INF = 1 << 30;
27 const int maxn = 1e6 + 10;
28 
29 char s[maxn];
30 int P[maxn];
31 int len;
32 
33 void Get_P(){
34     P[1] = 0;
35     int j = 0;
36     for(int i = 2; i <= len; ++i){
37         while(j > 0 && s[j + 1] != s[i]) j = P[j];
38         if(s[j + 1] == s[i]) j++;
39         P[i] = j;
40     }
41 }
42 
43 int main(){
44     while(scanf("%s",s + 1) != EOF){
45         if(s[1] == '.')
46             break;
47         len = strlen(s + 1);
48         Get_P();
49         if(len % (len - P[len]) == 0) printf("%d\n",len / (len - P[len]));
50         else printf("1\n");
51     }
52     return 0;
53 }

 然后为了适应字符串index一般从0开始,写了一个从0开始的版本:

 1 /*************************************************************************
 2     > File Name: 2406.cpp
 3     > Author: Natureal
 4     > Mail: 564374850@qq.com 
 5     > Created Time: Fri 12 Dec 2014 10:30:00 PM CST
 6 ************************************************************************/
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <cstdlib>
11 #include <cmath>
12 #include <vector>
13 #include <map>
14 #include <set>
15 #include <stack>
16 #include <queue>
17 #include <iostream>
18 #include <algorithm>
19 using namespace std;
20 #define lp (p << 1)
21 #define rp (p << 1|1)
22 #define getmid(l,r) (l + (r - l) / 2)
23 #define MP(a,b) make_pair(a,b)
24 typedef long long ll;
25 typedef unsigned long long ull;
26 const int INF = 1 << 30;
27 const int maxn = 1e6 + 10;
28 
29 char s[maxn];
30 int P[maxn];
31 int len;
32 
33 void Get_P(){
34     P[0] = -1;
35     int j = -1;
36     for(int i = 1; i < len; ++i){
37         while(j >= 0 && s[j + 1] != s[i]) j = P[j];
38         if(s[j + 1] == s[i]) j++;
39         P[i] = j;
40     }
41 }
42 
43 int main(){
44     while(scanf("%s",s) != EOF){
45         if(s[0] == '.')
46             break;
47         len = strlen(s);
48         Get_P();
49         if(len % (len - P[len - 1] - 1) == 0) printf("%d\n",len / (len - P[len - 1] - 1));
50         else printf("1\n");
51     }
52     return 0;
53 }
View Code

 

   

转载于:https://www.cnblogs.com/naturepengchen/articles/4160786.html

吃透 AM32 无人机电调:从源码架构到工作原理的全方位解析(附实践指南)(中) 介绍了三相电机控制中的SVPWM算法实现及保护机制设计。SVPWM部分详细解析了电压矢量扇区判断、占空比计算和过调制保护,通过限制占空比范围(0-100%)防止电机失控,并提供了完整的代码实现。保护模块则重点分析了过流、过压/欠压、过温三种保护机制,采用分级处理策略(硬保护停机/软保护降功率)确保系统安全。此外,文章还介绍了参数管理模块在STM32 Flash中的存储方案,包括参数定义、数据结构和读写操作,为电机控制系统提供了完整的解决方案。 阅读详情

相关推荐

【信息安全】seed-labs实验-Firewall Exploration Lab

本实验主要就是基于LKM和Netfilter实现简单的防火墙,重点是后者。路由器是有两个ip的,一个是外网ip,一个是内网ip每一次做完实验,都要做好收尾工作(比如:模块装入之后,要记得移除;iptables命令设置完规则之后,要把对应规则删掉)

可乐大牛的博客 5995

周期(KMP)

题目 一个字符串的前缀是从第一个字符开始的连续若干个字符,例如 abaab 共有 5 个前缀,分别是 a,ab,aba,abaa,abaab。 我们希望知道一个 N 位字符串 S 的前缀是否具有循环节。 换言之,对于每一个从头开始的长度为 i(i>1)的前缀,是否由重复出现的子串 A 组成,即 AAA…A (A 重复出现 K 次,K>1)。 如果存在,请找出最短的循环节对应的 K 值(也就是这个前缀串的所有可能重复节中,最大的 K 值)。 输入格式 输入包括多组测试数据,每组测试数据包括两行。

qq_45736714的博客 346

从PWM到正弦波:RC低通滤波器的魔法转换之旅

本文详细介绍了如何利用RC低通滤波器将STM32F103生成的PWM信号转换为高质量正弦波的技术原理与实践方法。通过分析滤波器设计、参数计算、硬件实现及Proteus仿真验证,为嵌入式开发者提供了一套完整的PWM转正弦波解决方案,适用于电机控制、音频信号生成等多种应用场景。

jupi8的博客 380

kmp周期(最小循环长度)

HDU 3746 大佬的讲解~ 很多博客都是直接贴代码(蒟蒻看不懂┭┮﹏┭┮),上面的链接 讲得比较仔细。偶遇蓝胖 这里在贴一张大佬讲解的截图吧(重点就在“j-next[j]”) 奇怪,截图竟然有水印。。。 下面是我的代码(单手捂脸)** #pragma warning (disable :4996) #include&amp;amp;lt;stdio.h&amp;amp;gt; #include&amp;amp;lt;iost...

ha_ha_to_yang的博客 1088

TI 实时操作系统SYS/BIOS使用总结

1:概述: SYS/BIOS 是一个可扩展的实时的操作系统。具有非常快速的响应时间(在中断和任务切换时达到较短的延迟),响应时间的确定性,强壮的抢占系统,优化的内存分配和堆栈管理(尽量少的消耗和碎片)。能够实现系统的模块化并可裁剪。 最大的特点就是:实时。 2:XDCtools: XDCtools 是SYS/BIOS引用的一种实时的软件组件技术(RTSC),它包括一些有用的工具,标准的AP

带头奋青的博客 5万+

Etcd教程 — 第三章 Etcd集群动态发现、DNS发现

Etcd教程 — 第三章 Etcd集群动态发现、DNS发现

Mr_XiMu的博客 2819

字符串查找问题,求解字符串的周期(KMP算法)

本总结是是个人为防止遗忘而作,不得转载和商用。 题目          给定文本串text和模式串pattern,从text中找出pattern第一次出现的位置。          记:文本串长度为N,模式串长度为M 暴力求解(BF)          这个简单。                    1,i = 0, j = 0                    2,判断tes

xueyingxue001的专栏 2866

ESP32+LED12864液晶屏实战:手把手教你显示中文与自定义图标(附完整代码)

本文详细介绍了如何使用ESP32单片机驱动带字库的LED12864液晶屏,实现中文显示与自定义图标。从硬件选型、接线方案到驱动编写、字库解析,提供了完整的实战代码与优化技巧,并最终构建了一个智能家居控制面板的完整示例项目。

weixin_29212867的博客 145

KMP字符串匹配算法 + 周期

KMP字符串匹配图解 代码实现 for(int i = 1, j = 0; i <= n; i++) { while(j && s[i] != p[j+1]) j = ne[j]; //如果j有对应p串的元素, 且s[i] != p[j+1], 则失配, 移动p串 //用while是由于移动后可能仍然失配,所以要继续移动直到匹配或整个p串移到后面(j = 0) if(s[i] == p[j+1]) j++; //当前元素匹配,j移向p串下一位

xiaoxiongyuan__s的博客 1107

决策大模型与生成式大模型有何不同?一文拆解技术框架与落地路径

大模型技术正从内容生成走向复杂场景的智能决策。与生成式大模型拟合概率分布不同,决策大模型以序列决策为核心,融合强化学习机制,在动态环境中感知反馈、持续修正行动路径。其技术框架涵盖语义理解、规划推理与闭环决策,并通过世界模型进行低成本仿真推演,显著提升供应链调度、物流排程等场景的应对效率。实际落地时需结合传统优化算法与人工兜底,构建“语义先导+数值寻优”的分层架构,才能平衡精度与稳定性。这篇内容拆解决策大模型的技术组成、落地路径与常见误区,为企业智能化转型提供可参考的实践框架。

weixin_29057163的博客 188

19、CATIA V5:参数化建模与零件目录创建全解析

本文详细解析了在CATIA V5中通过设计表实现参数化建模及零件目录创建的完整流程。以支撑块和钩形夹为例,介绍了参数识别、设计表创建与关联、配置管理以及零件目录的构建方法。同时,提供了实际操作建议和注意事项,帮助设计师高效创建和管理零件族,提升设计效率和质量。

raspberrypi5的博客 447

【算法竞赛进阶指南】141.周期 题解 KMP 最小循环节

可以从几乎任意位置开始,只要字符串的长度足够长以支持所描述的周期 (如果不支持,那么表示从j开始的后续部分无法使用T’进行重复构成,这样的情况则不需要讨论。上面的1就是下面的1(完全相同的部分),而下面的1等于上面的2(前后缀匹配),上面的2等于下面的2,而下面的2等于上面的3…反证: 假设原串存在一个子串T’,它不是最短循环节,也不是最短循环节的循环构成(倍数),但是可以循环构成原串。所以假设是错误的,也就是说,T确实是最短循环节。所以上面的1,2,3,4,5和下面的1,2,3,4,5完全相同。

AKAPinkman的博客 2135

复数值神经网络可能是深度学习的未来

复数这种东西,在人的头脑中似乎抽象、似乎复杂,然而,对于计算机来说,一点也不抽象,不复杂,那么,将复数概念推广到神经网络会是什么结果呢?本篇介绍国外的一些同行的尝试实践,请我们注意观察他们的进展。

gongdiwudu的专栏 6615

POJ--2406Power Strings+KMP求字符串最小周期

题目链接:点击进入 其实就是KMP算法next数组的简单应用。如果我们设这个字符串的最小周期为x 长度为len,那么由next数组的意义,我们知道len-next[len]的值就会等于x。这就是这个题目的关键点。代码如下:#include<iostream> #include<cstdio> #include<cstring> using namespace std;const int maxn=

荒野孤鹰 925

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

poj 2406 poj 1961 个人对吉大KMP模板的理解 KMP 基础题--找周期串

好佩服写kmp代码的人...   看死了终于看得有点明白了...... 学kmp先看两个比较好的总结 一是大牛matrix67的  http://www.matrix67.com/blog/archives/115/ 另一个是 http://www.cppblog.com/oosky/archive/2006/07/06/9486.html 这两个讲解非常好 摘一句我认为最重要的话

Pilgrim 1681

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

poj2406—KMP next数组的性质求最小周期

题目大意:给出一个字符串,求它最多有几个连续子串构成 分析:KMP求最小周期——结论:如果一个字符串有最小周期,那么最小周期为n-next[n] 考虑整个串,根据next数组的定义,前后匹配并且前缀和相等的最长的后缀之间没有交叉,那么相等的部分的长度为next[n],并且从左往右相等。 如果希望中间的也是有s[1..next[n]]的几个循环组成,那么整个串就以next[n]为最小周

zz_ylolita 1691

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

poj 2406 KMP求周期

又是KMP求周期,啥也不说了,代码如下: #include #include #include #include #include using namespace std; #define MAX 1000010 int next[MAX]; char t[MAX];//t是待判断的子串 void CalcNext(int length) //t串的长度 { int i,j; i=0;

zxc的专栏 392

poj2406 kmp简单求字符串周期

文章目录前言一、题目二、算法思想1.next数组求解(1)以下标1开始计算(2)以下标0开始计算2.思想三、代码 前言 已经要开始入手kmp系列的题了 提示:以下是本篇文章正文内容,下面案例可供参考 一、题目 传送门 二、算法思想 1.next数组求解 (1)以下标1开始计算 int getNext(char s[],int next[]) { int len=strlen(s); // int len=s.lengh(); next[1]=0; int j=0; int i=1; while

愤怒的小火柴人 623

POJ2406 KMP前缀周期

题意:       给你一个字符串,长度小于1百万,问你他最多可以拆成集合相同字符串,例如abcabcabc 可以拆成3个abc,所以输出3. 思路:       这个是比较常规的next应用,首先假设当前字符串长度n;那么 n - next[n]前缀为最短子串长度,如果n - next[n] != 0 && n / (n - next[n]) == 0,说明最后一个字符串是长度(

天使也掉毛 860

poj 2406 KMP求周期数

Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 41689   Accepted: 17335 Description Given two strings a and b we define a*b to be their concate

楠先生 507

[KMP求最小周期]POJ 2406 Power Strings

传送门:http://poj.org/problem?id=2406 题意:给定一个字符串,让你求出他最多由几个相同的连续子串连接而成。 思路:求出这个字符串的最小周期,然后用总长度/最小周期长度即是解。 关于如何求最小周期:这里YY了一个方法,就是把该字符串增长一倍,然后拿原来的字符串做模式,增长后的字符串做主串,用KMP求模式在主串第1个位置(下标为0,包含第一个位置)之后的第一个匹配位

Airarts_的专栏 823

LA3026 POJ1961 period 字符串周期(KMP) POJ2406 Power Strings

POJ 1961 http://poj.org/problem?id=1961  Period Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to

我的指针和我一样找不到对象 2782

poj2406--Power Strings+KMP求周期

先把结论摆出来:对于长为j的字符串str[1..j],next[j]=k,则令d=j-k;如果j%d==0,则这个字符串是一个 周期串,前d个字符是其最小的循环结,共包含j/d个循环节。 现在来解决两个问题: 1)前d个字符是其循环结         下标  1   2  3  4  5  6  7  8        字符串 a   b  a  b  a  b  a  b   

荒野孤鹰 771

POJ 2406(KMP求最小周期)

AC代码: 深入了解KMP的next数组:http://www.cnblogs.com/wuyiqi/archive/2012/01/06/2314078.html #include #include #include #include #include #include #include #define MAXN 10000009 int next[MAXN]; char S[MAXN]

Twilightuse93的专栏 595

POJ 2406 Power Strings KMP求周期

传送门http://poj.org/problem?id=2406 题目就是求循环了几次。 记得如果每循环输出为1.。。。 #include<cstdio> #include<cstring> const int MAXN=1000000+10; char P[MAXN]; int f[MAXN]; int n,m; void get...

weixin_30527423的博客 123

kmp2-HDU1358 HUST1010 POJ2406 POJ2752

HDU1358 http://acm.hdu.edu.cn/showproblem.php?pid=1358   先构造出 next[] 数组,下标为 i,定义一个变量 j = i - next[i] 就是next数组下标和下标对应值的差,如果这个差能整除下标 i,即 i%j==0 ,则说明下标i之前的字符串(周期性字符串长度为 i)一定可以由一个前缀周期性的表示出来,这个前缀的长度为刚才求...

少说,多做。 2960
上一篇: Poj--3461(字符串hash / KMP)
下一篇: Poj--2185(KMP,二维)
dingdi3021
博客等级 码龄11年 1粉丝 230原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值