poj2406 Power Strings(kmp) 给出一个字符串,问这个字符串是一个字符串重复几次.要求最大化重复次数. 若当前字符串为S,用kmp匹配'\0'+S和S即可. #include <cstdio> #include <cstring> using namespace std; const int maxn=2e6+5; char s1[maxn], s2[maxn]; int n1, n2, nxt[maxn], ans; int main(){ while (~…
Seek the Name, Seek the Fame POJ - 2752 http://972169909-qq-com.iteye.com/blog/1071548 (kmp的next的简单应用) 简单来讲,这道题就是要找字符串的所有相同前缀后缀. 第一次找出最大的相同前缀后缀,然后找次大的.次大的相同前缀后缀的前缀一定是在最大相同前缀后缀的前缀的前面取一段,次大的相同前缀后缀的后缀一定是在最大相同前缀后缀的后缀的后面取一段.由于是相同前缀后缀,将后缀的后面取的那一段移到前缀后面去取,问…
Seek the Name, Seek the Fame Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total Submission(s) : 12   Accepted Submission(s) : 7 Problem Description The little cat is so famous, that many couples tramp over hill an…
题意: 就是求前缀和后缀相同的那个子串的长度  然后从小到大输出 解析: emm...网上都用kmp...我..用拓展kmp做的  这就是拓展kmp板题嘛... 求出extend数组后  把extend[i] == len - i 的放到vector中 最后排序输出就好了 当然可以用kmp..emm..还是没有透彻kmp的next数组和 拓展kmp的next数组的意义 这段写给自己看: kmp的next是前缀和后缀的完全匹配(k - (i-1))的最长长度 拓展kmp的next是前缀和后缀(i…
Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 11831   Accepted: 5796 Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked the little cat to give names t…
http://poj.org/problem?id=2752 Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14611   Accepted: 7320 Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and asked…
seek():移动文件读取指针到指定位置 tell():返回文件读取指针的位置 seek()的三种模式: (1)f.seek(p,0)  移动当文件第p个字节处,绝对位置 (2)f.seek(p,1)  移动到相对于当前位置之后的p个字节 (3)f.seek(p,2)  移动到相对文章尾之后的p个字节 code: f = open('d:/hello.txt','w')         f.write('hello my friend python!\nsecond line.') f = op…
Description Given two strings a and b we define a*b to be their concatenation. For example, if a = "abc" and b = "def" then a*b = "abcdef". If we think of concatenation as multiplication, exponentiation by a non-negative inte…
题意 给定一个字符串 \(S\) ,一次操作可以在这个字符串的右边增加任意一个字符.求操作之后的最短字符串,满足操作结束后的字符串是回文. \(1 \leq |S| \leq 10^6\) 思路 \(\text{KMP}\) 的 \(fail\) 数组是整个算法最重要的东西,能拓展出很多东西. 对于一个模式串(pattern)\(P\) ,\(fail\) 数组为 \(f\) ,那么 \(f[i]\) 就是如果匹配到 \(i\) 这个位置失配,下次去尝试的位置,也就说明了从字符串头到 \(f[i…
题目大意:S(n,k)用k(2-16)进制表示1-n的数字所组成的字符串,例如S(16,16)=123456789ABCDEF10: 解题思路: n最大50000,k最大100000,以为暴力会超时.但确实可以暴力(wtf),直接将给的十进制数表示为K进制数.再暴力进行字符串比较即可(string的find函数??)或者使用KMP算法: 不确定A不AC的代码(其实是AC的): #include<bits/stdc++.h> using namespace std; ]; void getfil…
一.问题重述 现有字符串S1,求S1中与字符串S2完全匹配的部分,例如: S1 = "ababaababc" S2 = "ababc" 那么得到匹配的结果是5(S1中的"ababc"的a的位置),当然如果S1中有多个S2也没关系,能找到第一个就能找到第二个.. ------- 最容易想到的方法自然是双重循环按位比对(BF算法),但在最坏的情况下BF算法的时间复杂度达到了m * n,这在实际应用中是不可接受的,于是某3个人想出来了KMP算法(KMP…
Description In whiteblack on blackwhite is written the utterance that has been censored by the Ministry of Truth. Its author has already disappeared along with his whole history, and now, while Big Brother is watching somebody else, you, as an ordina…
题目: 题目的本质是给定两个字符串str1,str2,求str1中的str2串开始的地方,即字符串的匹配,KMP算法 思路:时间复杂度为O(m + n),空间复杂度为O(n),原串的长度为m,子串的长度为n KMP算法的本质是根据子串的next值求解的,所以首先讲解next值得求法: 字串的Next值的求解方法: next[i]的含义是:以i-1位置结尾的字符串与以0位置开始的字符串的最长匹配 1. 创建一个与子串大小相同长度的int型数组next 2. next值中的next[0] = -1,…
信奥一本通1465 KPM例题 题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1465 题目描述:给出花布条和小饰条(字符串),求花布条中能剪出几块小饰条. 先来一个暴力代码  (这题测试点是真氵,暴力竟然过了) #include<bits/stdc++.h> using namespace std; int next[1001],i=0,j=0,we=0; string a,b; int main(){ while(cin>&g…
先把两个串能匹配模式串的位置找出来,然后标记为$1$(标记在开头或末尾都行),然后对标记数组求一个前缀和,这样可以快速查到区间内是否有完整的一个模式串. 然后二分子串(答案)的长度,每次把长度为$md$的串扔到哈希表里,查一波匹不匹配. #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define ull unsigned long long #define…
题意:给一个字符串s,问s的某个前缀与后缀相同的情况时,长度是多少. 此题使用KMP的next数组解决. next数组中,j=next[i],next[i]表示S[0...i-1]的某个后缀(字符串S[i-j,i-1])与字符串S[0...j-1]完全相同,此时的j即该段字符串的长度. 字符串s本身是最长的串,next[L]对应的S[0...next[L]]是次长的符合条件的串,其他更短的串怎么求呢. 由于字符串S[L-j...L-1]等于S[0...j-1],这样在S[0...j-1]时继续利…
题目大意:小猫是非常有名气的,所以很多父母都来找它给孩子取名字,因为找的人比较多,小猫为了摆脱这个无聊的工作,于是它发明了一种取名字的办法,它把孩子父母的名字合在一起,然后从这个名字里面找一个前缀,并且这个前缀也得是后缀,然后用它当孩子的名字,比如父亲的名字是:ala,母亲的名字是la, 那么孩子的名字就可以是“a”,“ala”,“alala”, 现在想知道孩子的名字可以多长?   分析:最长的那个一定是字符串的长度,第二长的就是前缀后缀的最大匹配度 next[N],第三长的就是next[nex…
字符串匹配运用很广泛,举个简单例子,我们每天登QQ时输入账号和密码,大家有没有想过账号和密码是怎样匹配的呢?登录需要多长时间和匹配算法的效率有直接的关系. 首先理解一下前缀和后缀的概念: 给出一个问题:现在有一个文本串S="BBC ABCDAB ABCDABCDABDE"和一个搜索串(模式串)p="ABCDABD",要查找p在s中的位置.我们常用的一种方法就是暴力求解,暴力求解的思想是:让模式串从文本串的第一个字符开始往后匹配,假设现在文本串匹配到 i 位置,模式串…
1.Definition 串string,是零个或多个字符组成的有限序列.一般记作S="a1a2a3...an",其中S是串名,双引号括起来的字符序列是串值:ai(1<= i <=n)可以是字母.数字或其他字符:串中所包含的字符个数称为该串的长度.长度为零的串称为空串(Empty String),不包含任何字符. 2. 子串.主串:串中任意连续的字符组成的子序列被称为该串的子串.包含子串的串有被称为该子串的主串. 子串的位置:子串在主串中第一次出现的第一个字符的位置. 两个…
串的模式匹配算法     问题:         求子串位置的定位函数如何写? int index(SString S,SString T,int pos);         给定串S,子串T,问T在S中从pos位开始第一次出现的位置是? 我没有使用字符数组或者string,而是自己实现SString,(这其实是数据结构作业).S[0]中存放的是串的长度. 方法一:大暴力 #include<iostream> #include<cstdio> #define MAXSTRLEN 2…
题意:给定一个字符串,求它的每个前缀的的一个最长前缀,使得它重复两边后能够覆盖原串. Solution 这题显然要在KMP的next数组上做一些手脚. 对于一个前缀,我们把它重复两遍,那么这个前缀的前缀是这个串的后缀(可以忽略这句话). 那么我们需要求出这个串的最短前缀等于后缀. Code #include<iostream> #include<cstdio> #define N 1000009 using namespace std; int next[N],j,n; long…
放一个模板在这里搞事情...... 学KMP的话找SYCstudio吧(博客链接) 代码(多组数据,\(O(n)\)求一个串是否在另一个串里出现过) #include<cstdio> #define R register const int N=1e5+9; char s[N],t[N]; int ne[N]; int main(){ ne[0]=-1; R int i,j; while(~scanf("%s%s",s,t)){ for(i=1;t[i];++i){ for…
http://codeforces.com/problemset/problem/526/D 题意 给定一个串 T,对它的每一个前缀能否写成 A+B+A+B+...+B+A+B+A+B+...+B+A 的形式(k +1个 A,k 个 B,均可为空串) 分析 官方题解 对于前缀P,我们可以把它拆成P=SSSS…SSSST,其中T是S的前缀.显然可以用KMP算法,时间复杂度是O(n). 当T=S:P=SSS…S.假设S出现了R次.如果转换为ABABAB…ABABA的形式,A和B是由几个S组成,而且最…
3620: 似乎在梦中见过的样子 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 755  Solved: 445 Description “Madoka,不要相信 QB!”伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回中所发生的事.为了使这一次 Madoka 不再与 QB签订契约,Homura 决定在刚到学校的第一天就解决 QB.然而,QB 也是有许多替身的(但在第八话中…
传送门 思路简单不知为何调试了很久. 显然要么分成n个(所有字符相同),要么分成1个(原字符串无循环节),要么分成两个(有长度至少为2的循环节). 一开始以为可以直接hash搞定. 后来wa了几次之后发现可以轻松举出反例于是弃了hash. kmp大法好啊,判完循环节之后直接枚举两个子串的断点判是不是前缀与后缀同时满足条件就行了. 代码: #include<bits/stdc++.h> #define N 500005 #define mod 1000000007 using namespace…
Problem 2275 Game Accept: 62    Submit: 165Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number is B. Each turn, one player can do one…
题目 传送门:QWQ 分析 像求next一样求num. 第二次求next时加上不超过一半的条件. 时间复杂度: $ \huge O ( n ) $ 代码 // luogu-judger-enable-o2 #include <bits/stdc++.h> using namespace std; ; ], num[]; ]; long long ans; void kmp() { ans=; nxt[]=-; num[]=; ,j;i<=n;i++) { ]; j>= &&…
洛谷P3435:https://www.luogu.org/problemnew/show/P3435 思路 来自Kamijoulndex大佬的解释 先把题面转成人话: 对于给定串的每个前缀i,求最长的,使这个字符串重复两遍能覆盖原前缀i的前缀(就是前缀i的一个前缀),求所有的这些“前缀的前缀”的长度和 因为前缀i长度为p[i]的前缀和后缀相同 这说明:如果i有一个公共前后缀长度为j,那么这个前缀i就有一个周期为i-j 显然 图中蓝色线段是黑色线段的一个周期 那么我们先预处理出P数组 对于每个前…
题面 Description Will相信,很多同学都有过这样的经历:大牛已经写好了编程作业,而作为菜鸟的自己不会写怎么办呢?拿大牛的代码抄一下嘛!但是提交一模一样的作业是不是不太好?于是就改一改变量名什么的--但是其实这样的代码抄袭行为是可以被检测出来的. 考虑到如下的两段代码,很容易发现他们其实是一样的. 那么最开始给出的两段雷同代码就可以分别写成AiBjCiDECjDiFGC以及AaBiCaDECiDaFGC.或者简单的说,我们认为这两段代码是一样的. 现在请写一个程序,处理若干这样的代码…
描述 给定两个字符串A和B,请你求出字符串A最少重复几次才能使得B是A的子串. 例如A="hiho",B="hohihohi".则A重复3次之后变为"hihohihohiho",这时B是A的子串. 输入 输入包含多组数据. 第一行包含一个整数T,表示数据组数. (1 ≤ T ≤ 5) 对于每组数据,第一行包含一个字符串A,第二行包含一个字符串B. 对于30%的数据,1 ≤ |A|, |B| ≤ 1000 对于100%的数据, 1 ≤ |A|, |…