HDU 4333 Revolving Digits-----拓展KMP

2014-11-24 02:02:53 · 作者: · 浏览: 1
此题就是比较裸的拓展KMP。
此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]]