此SoL【转自KuangBin】:扩展KMP能求出一个串所有后缀串(即s[i...len])和模式串的最长公共前缀。于是只要将这个串复制一遍,求出该串每个后缀与其本身的最长公共前缀即可,当公共前缀>=len时,显然相等,否则只要比较下一位就能确定这个串与原串的大小关系。
至于重复串的问题,只有当这个串有循环节的时候才会产生重复串,用KMP的next数组求出最小循环节,用长度除以最小循环节得到循环节个数,在将3个答案都除以循环节个数即可。
这题搞出循环节就ok了。
#include#include #include #include using namespace std; const int maxn = 2000000 + 10; int next[maxn],extend[maxn]; //s主串 t子串 inline void ekmp(char *s,char *t) { int i,j,p,L; int lens=strlen(s); int lent=strlen(t); next[0]=lent; j=0; while(j+1 =len) cnt2++; else { if(str2[i+extend[i]]