http://acm.hust.edu.cn/vjudge/problem/28005 题意:给一个字符串S,令F(x)表示S的所有长度为x的子串中,出现次数的最大值.求F(1)..F(Length(S)) . 题解: 关键问题在于统计某个串出现了多少次. 在后缀自动机中,答案即为包含了这个串的状态的right集合的大小. 后缀自动机有两张DAG,一张是trans图,一张是parent树 从trans图的角度出发,right集合的大小为该状态走到结束状态的方案数 从parent树的角度出发,pa…
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 quote from the book: Tout avait Pair normal, mais tout s’affirmait faux. Tout avait Fair normal, d’abord, pu…
题意: 给出 n 个串,求出这 n 个串所有子串代表的数字的和. 题解; 首先可以把这些串构建后缀自动机(sam.last=1就好了), 因为后缀自动机上从 root走到的任意节点都是一个子串,所有可以利用这个性质来做 我们发现对于dp[u]−>dp[v]过程,如果之前走到 dp[u] 的有 12,2 两步,假设现在往 3 这条边走, 得到 12∗10+3,2∗10+3,那么其实这些值的贡献是可以一次性计算的,无论之前走到 dp[u] 的有几条路,都需要让他们全部 ∗10,而 3 的贡献则是由走…
题目链接:https://cn.vjudge.net/contest/283743#problem/H 题目大意:T组数据,给你一个字符串,然后让你求这个字符串的重复最多子串的次数. 具体思路:论文题. https://www.cnblogs.com/staginner/archive/2012/02/06/2340521.html. rmq处理的是某区间内的最小的前缀长度,这样查询的时候直接找到这个区间内的最小值就可以了. AC代码: #include<iostream> #include&…
题目传送门 题意:给出一个字符串,求子串的个数. 思路:后缀自动机的题真是每做一题就更理解一些. SAM中的每一状态$p$都代表了一种子串,而p包含的字符串的个数是$len[p]-len[fa[p]]$,所以答案就是$sigma len[i]-len[fa[i]]$,还有答案要开long long. #include<bits/stdc++.h> #define clr(a,b) memset(a,b,sizeof(a)) using namespace std; typedef long l…
题意:统计子串出现在主串中的次数 思路:典型kmp #include<iostream> #include<stdio.h> #include<string.h> using namespace std; ]; void GetNext(char t[]){//求next数组 int j,k,len; j=; k=-; next[]=-; len=strlen(t); while(j<len){ ||t[j]==t[k]){ ++j; ++k; next[j]=k…
求子串 数据结构中对串的5种最小操作子集:串赋值,串比较,求串长,串连接,求子串,其他操作均可在该子集上实现 数据结构中串的模式匹配 KPM模式匹配算法 基本的模式匹配算法 //求字串subString 在串string中的位置function subString(string, subString){ var i=0,j=0;//当i或j超出范围退出 while(i<string.length&&j<subString.length){ if(string[i]==subSt…
串的模式匹配的一般方法如算法4.5(在bo4-1.cpp 中)所示:由主串S 的第pos 个字 符起,检验是否存在子串T.首先令i 等于 pos(i 为S 中当前待比较字符的位序),j 等于 1(j 为T 中当前待比较字符的位序),如果S 的 第i 个字符与T 的第j 个字符相同,则i.j 各 加1 继续比较,直至T 的最后一个字符(找 到).如果还没到T 的最后一个字符,比较就 出现了不同(没找到),则令i 等于pos+1,j 等 于1,由pos 的下一个位置起,继续查找是否 存在子串T.这个…
[SPOJ8222]Substrings 试题描述 You are given a string S which consists of 250000 lowercase latin letters at most. We define F(x) as the maximal number of times that some string with length x appears in S. For example for string 'ababa' F(3) will be 2 beca…
对于重复次数,如果确定了重复子串的长度len,那重复次数k=lcp(start,start+len)/len+1.而暴力枚举start和len的复杂度是O(n^2),不能接受.而有一个规律,若我们只枚举len的整数倍作为起始,如果将它向前移动小于len位可以构成重复次数更长的串,那么那个位置p=start-len+lcp%len.所以每次我们计算两者并求max再与ans做max即可. #include <cstdio> #include <string> #include <…