kmp总结

                 搞了几天的kmp,这个NEXT数组真心博大精深啊,到现在还有些next数组还不会用。

          hdu 3336  Count the string 这道题就是对next数组的运用,可以得出一个公式,b[i]=b[next[i]]+1;把b数组全加起来就是所有前缀的和。

#include
#include
using namespace std;
int next[200001],n,b[200001],m;
char a[200001];
void getnext(char *p,int *next)
{
  int i,j;
  next[0]=-1;
  i=0;
  j=-1;
  while(i


hdu 1686 Oulipo      求子串在母串中出现的次数,也差不多是kmp模板题。。。

#include
#include
char a[10001],b[1000001];
int next[10001],x,y;
void getnext()
{
  int i,j;
  next[0]=-1;
  i=0;
  j=-1;
  while(i


hdu 1711  Number Sequence kmp模板题不解释。。。

#include
using namespace std;
int n,m;
int a[1000001],b[10001];
int next[10001];
void getnext(int *p,int *next)
{
  int i,j;
  next[1]=0;
  i=1;
  j=0;
   while(i


hdu 1358 Period  对next数组的运用,求母串中重复子串的次数和首地址。。这个重复子串必须是连续的,像aabaababbaab,最后一个aab就不算啦。。还有一个求周期问题,len-next[i]为此字符串的最小循环节(i为字符串的结尾),另外如果len%(len-next[i])==0,此字符串的最小周期就为len/(len-next[i]);

 

#include
#include
using namespace std;
char a[1000001];
int next[1000001],n;
void getnext(char *p,int *next)
{
  int i,j;
  i=0;
  j=-1;
  next[0]=-1;
  while(i1)
        printf("%d %d\n",i,y);
    }
    j++;
    printf("\n");
  }
}


hdu 3746 Cyclic Nacklace 求循环节问题,也是对next数组的运用。。。。

给你一个字符串,要求将字符串的全部字符最少循环2次需要添加的字符数。

例子:

abcabc 已经循环2次,添加数为0

abcac 没有循环2次,添加字符abcac。数目为5.

abcabcab 已经循环过2次,但第三次不完整,需要添加数为1

#include
#include
using namespace std;
int n,next[100001],len;
char a[100001];
void getnext(char *p,int *next)
{
  int i,j;
  next[0]=-1;
  i=0;
  j=-1;
  while(i


hdu 2594 Simpsons' Hidden Talents  求第一个字符串的前缀与第二个字符串的后缀的最长公共子串,也是一道模板题。。。我这里用的事优化版的next数组,注意最后一个next数组的值。。。

 

#include
#include
using namespace std;
char a[50001],b[50001];
int next[50001],x,y;
void getnext()
{
  int i,j;
  next[0]=-1;
  i=0;
  j=-1;
  while(i>a)
  {
      cin>>b;
      x=strlen(a);
      y=strlen(b);
      n=kmp();
     if(n==0)
     printf("0");
     else
     {
          for(i=0;i


下面是poj上的,真心觉得hdu上的题目难度系数大的到poj上就成了水题啦。。。我基本做的都是水题,学这个算法,这些题来做还是很好理解的,容易上手。。现在从hdu转到poj上做啦。。。。

poj 2406 Power Strings 求周期。。

#include
#include
using namespace std;
char a[1000001];
int next[1000001],len;
void getnext()
{
  int i,j;
  next[0]=-1;
  i=0;j=-1;
  while(i


poj 2752  Seek the Name, Seek the Fame 字符串前缀子串等于后缀子串,输出前缀最后一个字母的位置。。next数组的运用。。。

#include
#include
using namespace std;
char a[400001];
int next[400001],len,ans[400001];
void getnext()
{
  int i,j;
  next[0]=-1;
  i=0;j=-1;
  while(i0)
   {
     i=next[i];
	 ans[j++]=i;
   }
   for(i=j-1;i>=0;i--)
	   printf("%d ",ans[i]);
   printf("%d\n",len);
  }
  return 0;
}


暂时只做了这些很水的题目,多效的题现在对于自己还有点苦难,加油

 

你可能感兴趣的:(专题总结)