摘要:KMP+dp经典#include<stdio.h>#include<string.h>#define mod 10007char t[200010];int next[200010];int num[200010];int cnt;void get_next(char T[],int len,int next[]){ int i=0,j=-1; next[0]=-1; while(i<len) { if(j==-1 || T[i]==T[j]) { j++; i++; next[i]=j; } else j=next[j]; }}void main(){int c
阅读全文
摘要:最小表示+kmp#include<iostream>using namespace std;const int maxn=2000005;//最小表示+最大表示+KMP //问题描述,求字典序最小的和字典序最大的位置,若多个取最左边的,并给出在这n个串中出现次数//注意自身得情况,由于出始扩大了一倍,但自身只能算一次,这里要注意 char b[maxn];char a[maxn];int next[maxn];int minshow(char *s){ int i=0,j=1,k=0,n=strlen(s); while(i<n/2&&j<n/2&
阅读全文
摘要:题意:给出一个串,问你这个串的所有前缀,最多是由多少个相同的子串重复连接而成的。代码:#include<iostream>#include<fstream>using namespace std;char c[1000005];int next[1000004];int len;void get(){ int i,j,k; j=0;k=-1;next[0]=-1; while(j<len) if(k==-1||c[j]==c[k]) next[++j]=++k; else k=next[k];}void read(){// ifstream cin("i
阅读全文
摘要:题意:给出一个串,问你这个最多是多少个相同的字串重复连接而成的。如:ababab则最多有3个ab连接而成。代码:#include<iostream>#include<fstream>using namespace std;char c[1000005];int next[1000004];int len;void get(){ int i,j,k; j=0;k=-1;next[0]=-1; while(j<len) if(k==-1||c[j]==c[k]) next[++j]=++k; else k=next[k];}void read(){// ifstrea
阅读全文
摘要:题意:给你一个串,如果这个串存在一个长度为n的前缀串,和长度为n的后缀串,并且这两个串相等,则输出他们的长度n。求出所有的长度n。代码:#include<iostream>#include<fstream>using namespace std;char c[400003];int next[400004];int len;void getnext(){ int i,j,k; j=0;k=-1; next[0]=-1; while(j<len) { if(k==-1||c[j]==c[k]) next[++j]=++k; else k=next[k]; }}voi
阅读全文
摘要:题意:给你一个子串(模式串)和一个母串(文本),问子串在母串中出现的次数。代码:#include<iostream>#include<fstream>using namespace std;char s[10012];char t[1000012];int next[10011];void getnext(){ int i,j,k; j=0;k=-1;next[0]=-1; int len=strlen(s); while(j<len) if(k==-1||s[k]==s[j]) next[++j]=++k; else k=next[k];}void kmp(){
阅读全文
摘要:题意:给你n个的串,求出它们的最长公共子串,如果不存在这个子串,则输出“IDENTITYLOST”,如果存在多个最长公共子串,则输出字典序最小的那一个。代码:#include<iostream>#include<fstream>using namespace std;char c[4001][202];int len[4001];int next[210];char str[210];int n;void getnext(char c[]){ int i,j,k; int len=strlen(c); j=0;k=-1;next[0]=-1; while(j<le
阅读全文