题目大意

给出一个字符串S,S可能是多个较短的字符串的重复连接。比如"ababab"为字符串"ab"重复三次的结果;"abc" 为"abc"重复一次的结果;"abababab"可能是"abab"重复两次,也可能是"ab"重复四次的结果。 
    对一个给定的字符串S,求出最大的k,使得它为某个子串A重复k次的结果。

题目分析

有了kmp的next数组(存储某子串的最长相同前后缀的长度),可以在此基础上分析。字符串S的子串A越短,则重复次数越多。 
    (1)显然,对于一个最多含有K个重复的A构成的串S,S的最长相同前后缀S1为K-1个A重复的结果; 
    (2)若S的最长相同前后缀S1和S确定的剩余部分S-S1(记为子串B)不能通过多个连接起来形成S1或者S,那么S必定无法分解为多个子串相连接的结果。 
    证明性质(2),若S-S1(记为A)不能拼成S或者S1,而S可以由多个子串拼接而成。假设S由P(不是最大的)个相同的子串B构成,那么P-1个B连接起来一定为S的相同前后缀(不一定为最长相同前后缀),且该相同前后缀的长度必定大于 strlen(S)/2,则strlen(S1)必定大于strlen(S)/2,则S的最长相同前后缀在S中必定相交! 
    对于串S,若他的最长前后缀相交,则可以肯定 S 由K个(S-S1)拼接而成。(通过画图可以说明)

实现(c++)

#define _CRT_SECURE_NO_WARNINGS
#define MAX_WORD_LEN 1000005
#include<stdio.h>
#include<string.h>
int gNext[MAX_WORD_LEN];
char gWord[MAX_WORD_LEN];
int gLength[MAX_WORD_LEN];
void GenerateNext(const char* sub_str, int* next, int len){
next[0] = 0; //next[i]表示sub_str[0, i]中最长相同前后缀的长度
for (int i = 1; i < len; i++){
int j = next[i - 1];
while (sub_str[j] != sub_str[i]){ //不断回溯,每次利用next数组来确定下一个需要判断的位置
if (j == 0){
j = -1;
break;
}
j = next[j - 1];
}
if (j < 0)
next[i] = 0;
else
next[i] = j + 1;
}
} int main(){
while (scanf("%s", gWord) != EOF){
if (strcmp(gWord, ".") == 0){
break;
}
int len = strlen(gWord);
GenerateNext(gWord, gNext, len);
if (len % (len - gNext[len - 1]) == 0){
printf("%d\n", len / (len - gNext[len -1]));
}
else
printf("1\n");
}
return 0;
}

poj_2406 kmp的更多相关文章

  1. poj_2406 KMP寻找重复子串问题

    B - Power Strings Time Limit:3000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

  2. KMP POJ 1961 Period

    题目传送门 /* 题意:求一个串重复出现(>1)的位置 KMP:这简直和POJ_2406没啥区别 */ /******************************************** ...

  3. KMP POJ 2406 Power Strings

    题目传送门 /* 题意:一个串有字串重复n次产生,求最大的n KMP:nex[]的性质应用,感觉对nex加深了理解 */ /************************************** ...

  4. KMP算法求解

    // KMP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespac ...

  5. 简单有效的kmp算法

    以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说 ...

  6. KMP算法

    KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串 ...

  7. 萌新笔记——用KMP算法与Trie字典树实现屏蔽敏感词(UTF-8编码)

    前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"* ...

  8. [KMP]【学习笔记】

    Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36916   Accepted: 14904 Descript ...

  9. KMP算法实现

    链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解 ...

随机推荐

  1. Idea配置sbt(window环境)

    近开发spark项目使用到scala语言,这里介绍如何在idea上使用sbt来编译项目. 开发环境:windows 1. 下载sbt http://www.scala-sbt.org/download ...

  2. Hive Tuning(一) 连接策略

    群里共享了一本hive调优的书记,名叫<Hive Tunning>,就忍不住开始看了,也顺便记录一下自己学到的东西,备忘! 首先,这是hive的数据摘要,别问我什么意思,我也没看懂. 好, ...

  3. tomcat7项目启动报错java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory

     报这个错说明用的是tomcat7 打开myeclipse,Preferentces->MyEclipse->Servers->Tomcat->Tomcat 6.x ,载入 ...

  4. HISTTIMEFORMAT 设置历史命令时间的格式

    echo 'HISTTIMEFORMAT="%F %T `whoami`"  ' >>/etc/bashrc whoami 完了后面要有空格不然会连住和命令 ===== ...

  5. chkconfig关闭必须的5个服务或者取出第一列

    chkconfig 查找出第一列,开头不包含0的 chkconfig|egrep -o "^[^0]+"|egrep -v "sshd|network|crond|sys ...

  6. oracle权限详解

    一.权限分类:系统权限:系统规定用户使用数据库的权限.(系统权限是对用户而言). 实体权限:某种权限用户对其它用户的表或视图的存取权限.(是针对表或视图而言的). 二.系统权限管理:1.系统权限分类: ...

  7. selenium测试(Java)(三)

    控制浏览器: http://www.cnblogs.com/moonpool/p/5657752.html

  8. 【面试】hibernate n+1问题

    Hibernate中常会用到set,bag等集合表示1对多的关系, 在获取实体的时候就能根据关系将关联的对象或者对象集取出, 还可以设定cascade进行关联更新和删除.这不得部说hibernate的 ...

  9. C# 发邮件 服务器响应为: 5.7.0 Must issue a STARTTLS command first

    The SMTP server requires a secure connection or the client was not authenticated. The server respons ...

  10. ffmpeg笔记——UDP组播接收总结

    ffmpeg在avformat_open_input里面已经实现了UDP的协议,所以只需要设置好参数,将url传递进去就可以了. 和打开文件的方式基本一样: 01 AVCodecContext *pV ...