首页 > 其他分享 >POJ--1961 Period(KMP)

POJ--1961 Period(KMP)

时间:2024-02-22 21:44:58浏览次数:29  
标签:nxt -- printf next int POJ str KMP include

记录
18:26 2024-2-22

http://poj.org/problem?id=1961

利用KMP构造next数组,其实next数组就是方便于找到下一个应该比较的字符,或者说是不动目标字符,移动查找字符,这里面利用next数组就可以很快捷的移动

这道题是利用next字符,给出证明的结果是
当 i - next[i] 能整除 i时, S[1 ~ i - next[i]]就是 S[1 ~ i]的最小循环元
同理 对 i - next[next[i]] 能整除时,S[1 ~ i - next[next[i]]] 就是次小循环元,可以以此找到最大循环元

next下标从1开始

点击查看代码
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 1000005;
int N;
int T = 1;
int nxt[MAXN];
char str[MAXN];

//下标从1开始
void calc_next() {
    nxt[1] = 0;
    for (int i = 2, j = 0; i <= N; i++) {
        while (j > 0 && str[i] != str[j+1]) j = nxt[j];
        if (str[i] == str[j+1]) j++;
        nxt[i] = j;
    }
}

int main() {
    while (cin >> N && N != 0) {
        scanf("%s", str + 1);
        calc_next();
        printf("Test case #%d\n", T);
        T++;
        for(int i = 2; i <= N; i++) {
            if(i % (i - nxt[i]) == 0 && i / (i - nxt[i]) > 1) {
                printf("%d %d\n", i, i / (i - nxt[i]) );
            }
        }
        printf("\n");
    }
    
}

next下标从0开始

点击查看代码
#include<iostream>
#include<vector>
#include<stdio.h>
#include<string.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 1000005;
int N;
int T = 1;
int nxt[MAXN];
char str[MAXN];

//下标从0开始
void calc_next() {
    nxt[0] = -1;
    for (int i = 1, j = -1; i < N; i++) {
        while (j >= 0 && str[i] != str[j+1]) j = nxt[j];
        if (str[i] == str[j+1]) j++;
        nxt[i] = j;
    }
}

int main() {
    while (cin >> N && N != 0) {
        scanf("%s", str);
        calc_next();
        printf("Test case #%d\n", T);
        T++;
        //如果从零开始 要变为i + 1
        for(int i = 1; i < N; i++) {
            if((i + 1) % (i - nxt[i]) == 0 && (i + 1) / (i - nxt[i]) > 1) {
                printf("%d %d\n", (i + 1), (i + 1) / (i - nxt[i]) );
            }
        }
        printf("\n");
    }
    
}

标签:nxt,--,printf,next,int,POJ,str,KMP,include
From: https://www.cnblogs.com/57one/p/18028274

相关文章

  • 【libGDX】使用Mesh绘制矩形
    1前言​使用Mesh绘制三角形中介绍了绘制三角形的方法,本文将介绍绘制正方形的方法。​libGDX以点、线段、三角形为图元,没有提供绘制矩形内部的接口。要绘制矩形内部,必须通过三角形拼接而成,如下图,是通过GL_TRIANGLE_FAN模式绘制矩形。​绘制的坐标点如下,屏幕中......
  • C++ 第三节课 指针的使用
    #include<iostream>usingnamespacestd;voidshow(){cout<<"全局函数"<<endl;}structStu{inta;voidwrite_code(){cout<<"成员函数"<<endl;}};intmain(){cout<<......
  • 简单了解HTTP、Websocket和Netty
    前言伴随着网络的快速发展,网络通讯越来越重要,通讯的快捷、安全、方便影响着用户的体验。本文将探讨这些技术的原理、特点以及在实际应用中的应用场景。1.HTTTP(超文本传输协议)HTTP是一种传输超文本的协议,它是现代互联网通信的基础。其特点包括:简单性:HTTP使用简单的请求-响应模......
  • Angular Material 17+ 高级教程 – Custom Themes (自定义主题) for Material Design
    前言AngularMaterialv17.2.0发布了MaterialDesign3Theme   上一篇 AngularMaterial17+高级教程–GetStarted下一篇TODO想查看目录,请移步 Angular17+高级教程–目录......
  • 天喻教育墨水屏(天喻教育平板)M3破解教程(3)
    天喻教育墨水屏(天喻教育平板)M3破解教程(3)宇宙安全声明:本教程非广告!本身已经正在使用天喻教育墨水屏的读者才需观看此教程!禁止使用本教程破坏纪律,影响自身和他人上课专注要求!若不当使用本教程造成他人利益损害,本人不承担任何责任!本教程为本人原创,禁止盗传! 在观看教程(三)前,请先......
  • 24 - 格式化字符串
    格式化字符串笔者认为格式化字符串(formattedstring)在任何语言里都值得单独拿出来做个笔记,因为它是编程中控制输出的重要一环。FormattedStringLiterals(f-string)官网的翻译为“格式化字符串字面值”。比较常用的格式化方法。在字符串前加上前缀f或F,通过{expres......
  • 腾讯云Linux服务器 前端Nginx+后端 项目部署
    一、前端项目部署1.安装nginx服务器:在root目录下创建services文件并下载nginx源文件【nginx-1.21.6.tar.gz】 建议尽量选择稳定版本下载  nginx官网下载地址​​​​cd/rootmkdirservicescdservicescurl-onginx-1.21.6.tar.gzhttp://nginx.org/download/......
  • 《程序是怎样跑起来的》第六章读后感
    《程序是怎样跑起来的》第六章讲的主要是亲自尝试压缩数据,我们可以学习到程序文件中的数据是如何以字节为单位存储在磁盘等存储媒介中的。文件是字节数据的集合。本章介绍了文件存储的基本单位——字节,1字节表示的字节数据有256种,用二进制数来表示的话,其范围就是00000000~1111111......
  • 洛谷 P6785 [COCI2013-2014#6] KRUŽNICE
    COCI的题。显然,手模样例发现答案分为以下几个贡献:所有圆外面的那个大平面,贡献为\(1\)。每个圆至少被分成一部分,贡献为\(n\)。如果有一个圆被“拦腰截断了”,即整条直径上都被更小的圆填满了,就额外对答案贡献加\(1\),这也是我们所求部分。暴力跳set遇事不决,先打暴力;不加......
  • 对于系统内容和系统方法的认识(《系统科学方法概论》绪论+第一章)
    通过阅读绪论和第一章的内容,我对于系统论的构成、发展、内容有了初步的了解。通过阅读绪论,我认识到系统科学是一个庞大的体系,包括系统论,控制论,信息论。并且通过阅读系统论的产生发展条件,我认为:系统论是根据时势所趋,人类为了推动时代发展,利用时代发展的工具,其中包括人类利用系统论......