hdu1358 KMP】的更多相关文章

题意:给你一个长度为n的字符串,问你一共有多少Xi——从0开始到Xi的这段长度这个字符子串是循环串,并输出最多的循环节的次数: 解题思路:用kmp的next数组,我们从next数组的值中可以看出这个字串是否为循环串,例如: void get_next() { int j,k; j=0;k=-1;next1[0]=-1; while(j<tlen) { if(k==-1||t[j]==t[k]) next1[++j]=++k; else k=next1[k]; } } ababa next[0]=…
求循环节. #include<stdio.h> #include<string.h> #define maxn 1000010 int next[maxn]; char s[maxn]; void getnext() { int j,k,len=strlen(s); j=; k=-; next[]=-; while(j<len) { ||s[j]==s[k]) { j++; k++; next[j]=k; } else k=next[k]; } } int main() {…
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 know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the largest K > 1 (…
Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7535    Accepted Submission(s): 3628 Problem Description For each prefix of a given string S with N characters (each character has an ASCII…
题目链接:https://vjudge.net/problem/HDU-1358 Period Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9652    Accepted Submission(s): 4633 Problem Description For each prefix of a given string S with…
题意 求所有循环次数大于1的前缀 的最大循环次数和前缀位置 解法 直接用KMP求最小循环节 当满足i%(i-next[i])&&next[i]!=0 前缀循环次数大于1 最小循环节是i-next[i] #include <cstdio> #include <cstring> #include <iostream> #include <cstdlib> using namespace std; char S[2000000]; int NEXT…
给出一个字符串,找出所有可以作为它循环节的子串长度 利用kmp的失配数组的性质,可以直接做 #include<stdio.h> #include<string.h> ; char t[maxm]; int p[maxm]; int main(){ int m; ; while(scanf("%d",&m)!=EOF&&m){ int i,j; scanf("%s",t); p[]=p[]=; ;i<m;i++){…
Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 20436   Accepted: 9961 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 know whether the…
题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提交过程 TLE maxn没给够 AC 代码 #include <cstring> #include <cstdio> const int maxm=1e6+20; char P[maxm]; int fail[maxm]; void getFail(int m){ fail[0]=fa…
题意:       给你一个字符串,让你找到一些字符串,这个字符串是从第一个字母开始的,并且他可以分成1个一上循环子结构够成的,比如 abcabcabc  那么当前的这个串就是三个abc构成的,他的AK值就是3,对于输出的答案中就会包含当前这个状态,表示为9 3. 思路:       就像最小路径覆盖是二分匹配的一个景点应用一样,这种循环节的也是KMP的一个应用,结论是  当 i % (i - next) == 0时,如果 i/(i - next[i]) > 1就输出 i ,i/(i-next[…
链接 http://acm.hdu.edu.cn/showproblem.php?pid=1358 思路 当初shenben学长暑假讲过,当初太笨了,noip前几天才理解过来.. 我也没啥好说的 代码 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=1e6+7; int n,len,fail[N]; char s[N]; void get_…
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 know whether the prefix is a periodic string. That is, for each i (2 <= i <= N) we want to know the largest K > 1 (…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1358 题目大意:给你一个长度为 \(n\) 的字符串 \(s\) ,那么它有 \(n\) 个前缀. 对于第 \(i\) 个前缀 \(t\) ,如果他们表示成一个子串重复 \(K\) 次 \((K>1)\) ,那么我们就输出这个前缀 \(t\) 的长度以及对应的最大的 \(K\) .(因为对于 \(aaaa\) 来说,\(K\) 可以为 \(4\) 或者 \(2\) ,但是 \(4\) 比较大,所以选…
证明1: 对于一个字符串S,长度为L,如果由长度为len的字符串s(字符串s的最小循环节是其本身)循环k次构成,那么字符串s就是字符串S的最小循环节 那么字符串有个很重要的性质和KMP挂钩,即  i - next[i] 为字符串s的长度 i%(i - next[i]) ==0 证明:字符串S由s循环k次构成,那么有S[0-->L-len-1] == S[len-->L-1],即前k-1个循环节和后k-1个循环节构成的字符串相等 那么此时KMP数组的next[L] = k-1个循环节的长度, 也…
题目大意:求字符串的前缀是否为周期串,若是,打印出循环节的长度以及循环次数. 这道题考察的是KMP算法中next数组的应用,必须理解透next[]数组代表的含义才t能通过它解决这道题.思路是先构造出 next[] 数组,下标为 i,定义一个变量 t = i - next[i] 就是next数组下标和下标对应值的差,如果这个差能被下标i整除,即 i%t==0 ,则说明下标i之前的字符串(周期性字符串长度为 i)一定可以由一个前缀周期性的表示出来,这个前缀的长度为刚才求得的那个差,即 t,则这个前缀…
一. KMP 1 找字符串x是否存在于y串中,或者存在了几次 HDU1711 Number Sequence HDU1686 Oulipo HDU2087 剪花布条 2.求多个字符串的最长公共子串 POJ3080 Blue Jeans HDU1238 Substrings 3.next数组的应用 1) 求循环节 HDU3746 Cyclic Nacklace HDU1358 Period POJ2406 Power Strings HDU3374 String Problem 2) 利用next…
字符串算法并不多,KMP,trie,AC自动机就是其中几个最经典的.字符串的题目灵活多变也有许多套路,需要多做题才能体会.这里收集了许多前辈的题目做个集合,方便自己回忆. KMP题目:https://blog.csdn.net/qq_38891827/article/details/80501506 Trie树题目:https://blog.csdn.net/qq_38891827/article/details/80532462 AC自动机:模板https://www.luogu.org/bl…
// KMP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> using namespace std; int BF(char S[], char T[]) {  int i=0, j=0;  int index = 0;  while ((S[i]!='\0')&&(T[j]!='\0'))  {   if (S[i]==T[j])   {    i++;    j++;   }…
以前看过kmp算法,当时接触后总感觉好深奥啊,抱着数据结构的数啃了一中午,最终才大致看懂,后来提起kmp也只剩下“奥,它是做模式匹配的”这点干货.最近有空,翻出来算法导论看看,原来就是这么简单(先不说程序实现,思想很简单). 模式匹配的经典应用:从一个字符串中找到模式字串的位置.如“abcdef”中“cde”出现在原串第三个位置.从基础看起 朴素的模式匹配算法 A:abcdefg  B:cde 首先B从A的第一位开始比较,B++==A++,如果全部成立,返回即可:如果不成立,跳出,从A的第二位开…
KMP算法是字符串模式匹配当中最经典的算法,原来大二学数据结构的有讲,但是当时只是记住了原理,但不知道代码实现,今天终于是完成了KMP的代码实现.原理KMP的原理其实很简单,给定一个字符串和一个模式串,然后找模式串在给定字符串中的位置.将两个字符串转换为字符数组,然后从两个数组的开始位置"i","j"开始匹配,如果相同,执行"i++","j++"接着比较下一位:如果不相同,就转到模式串对应next数组的对应位置"ne…
前几天写好了字典,又刚好重温了KMP算法,恰逢遇到朋友吐槽最近被和谐的词越来越多了,于是突发奇想,想要自己实现一下敏感词屏蔽. 基本敏感词的屏蔽说起来很简单,只要把字符串中的敏感词替换成"***"就可以了.对于子串的查找,就KMP算法就可以了.但是敏感词这么多,总不能一个一个地遍历看看里面有没有相应的词吧! 于是我想到了前几天写的字典树.如果把它改造一下,并KMP算法结合,似乎可以节约不少时间. 首先说明一下思路: 对于KMP算法,这里不过多阐述.对于敏感词库,如果把它存进字典树,并在…
Oulipo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 36916   Accepted: 14904 Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e'. He was a member of the Oulipo group. A quot…
链接:http://blog.csdn.net/joylnwang/article/details/6778316 KMP算法是一种很经典的字符串匹配算法,链接中的讲解已经是很明确得了,自己按照其讲解大体实现了一遍,感觉还不错.其算法的效率在于next表的建立上,宗旨就是避免朴素匹配算法中的冗余回溯问题.还是直接上代码吧. #ifndef ALGKMP_H__ #define ALGKMP_H__ static class KMP { public: KMP(char *pattern, cha…
1.[HDU 3336]Count the string(KMP+dp) 题意:求给定字符串含前缀的数量,如输入字符串abab,前缀是a.ab.aba.abab,在原字符串中出现的次数分别是2.2.1.1,所以答案是2+2+1+1=6. 解题思路:s[]=abcdabcdabcdea ==> f[] = 00001234567801,f[i]=k的含义是s[i-k]=s[i],dp[i]=dp[f[i]]+1,dp[i]表示以s[i]结尾的前缀的数量 #include <iostream>…
说起kmp就要从字符串的匹配说起,下面我们谈谈字符串的匹配 给定一个原字符串:bababababababababb,再给定一个模式串:bababb,求模式串是否在源字符串中出现 最简单的方法就是遍历源字符串,再遍历模式串,依次进行对比.当遇到不匹配的字符时源字符串和模式串返回下一个位置重新开始匹配,复杂度为n^2. 普通方法其实有可以优化的地方,假设源为字符串Q[1...n],模式串M[1...m]. 按照普通方法Q和M从i,j处进行匹配,当在k位置发生不匹配时,Q返回i+1位置,M返回开始0处…
参考:http://www.cnblogs.com/c-cloud/p/3224788.html #include<stdio.h> #include<string.h> void makeNext(const char P[],int next[]) { int q,k; int m = strlen(P); next[] = ; ,k = ; q < m; ++q) { && P[q] != P[k]) k = next[k-]; if (P[q] ==…
KMP算法基本思想有许多博客都写到了,写得也十分形象,不懂得可以参考下面的传送门,我就不解释基本思想了.本文主要给出KMP算法及next数组的计算方法(主要是很多网上的代码本人(相信应该是许多人吧)看不懂,直接拿来用也是各种问题),这里的代码封装性和优化都有待考究,但是基本能实现KMP算法 http://www.cnblogs.com/c-cloud/p/3224788.html 这里提醒各位看官,while循环次数不是常见的固定次数的循环,而是动态根据实际情况将大家固认为的“一趟循环”分解成几…
最近忙着考研复习,所以刷题少了.. 数据结构昨天重新学习了一下KMP算法,今天自己试着写了写,问题还不少,不过KMP算法总归是理解了,以前看v_JULY_v的博客,一头雾水,现在终于懂了他为什么要在算完next[]之后,所有值都减一了...... 为了顺便复习下C语言,就没有用C++写,而且写出来比较丑.. #include <string.h> #include <stdio.h> #include <stdlib.h> const int MAXSIZE = 100…
[BZOJ3942][Usaco2015 Feb]Censoring Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so they have plenty of material to read while waiting around in the barn during milking sessions. Unfortunately, the…
Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M <= 10000, 1 <= N <= 1000000). Your task is to find a number K which make a[K] = b[1], a[K + 1] = b[2], ...... , a[K + M - 1] = b[M]. If there are…