KMP

博客1:KMP的介绍和解释

博客2:next数组的应用

代码:

hdu 3336

#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int max_=2e5+2;
const int mod=1e4+7;
int n;
int nex[max_];
char str[max_];
void getnext()
{
    nex[0]=-1;
    int k=-1,i=0;
    while(i<n)
    {
        while(k>-1&&str[k]!=str[i]) k=nex[k];
         nex[++i]=++k;
    }
}
int getsum()
{
    getnext();
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        if(nex[i]>0)
        {
            ans=(ans+2)%mod;
        }
        else
            ans=(ans+1)%mod;
    }
    return ans;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
    scanf("%d%s",&n,str);
    int sum=getsum();
    /*for(int i=1;i<=n;i++)
        printf("%d ",nex[i]);*/
    printf("%d
",sum);
    }
}

代码:1358

#include<stdio.h>
#include<algorithm>
#include<iostream>
using namespace std;
const int max_=1e6+5;
int n;
char str[max_];
int nex[max_];
void getnext()
{
    int k=-1;
    int i=0;
    nex[0]=-1;
    while(i<n)
    {
        while(k>-1&&str[k]!=str[i])
            k=nex[k];
        nex[++i]=++k;
    }
}
int main()
{
    int tcase=1;
    while(~scanf("%d",&n))
    {
        if(n==0)
          break;
        scanf("%s",str);
        getnext();
        printf("Test case #%d
",tcase);
      for(int i=2;i<=n;i++)
      {
          int k=i-nex[i];
          if(i%k==0&&nex[i])
          {
              int kk=i/k;
              printf("%d %d
",i,kk);
          }
      }
      printf("
");
      tcase+=1;
    }
}

 hdu 1711

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int max_=1e6+5;
int a[max_],b[max_];
int nex[max_];
void getnext(int n)
{
    int k=-1,i=0;
    nex[0]=-1;
    while(i<n)
    {
        while(k>-1&&b[i]!=b[k])
            k=nex[k];
        nex[++i]=++k;
    }
}
int solve(int n,int m)
{
    int i=0,j=0;
    while(i<n&&j<m)
    {
        while(j!=-1&&a[i]!=b[j])
            j=nex[j];
        i++,j++;
    }
    if(j==m)
        return i-j+1;
    else
        return -1;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        scanf("%d %d",&n,&m);
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(int i=0;i<m;i++)
        {
            scanf("%d",&b[i]);
        }
        getnext(m);
        printf("%d
",solve(n,m));
    }
}

hdu 1686

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int max_=1e6+5;
char str[max_],mo[max_];
int nex[max_];
void getnext(int n)
{
    int i=0,k=-1;
    nex[0]=-1;
    while(i<n)
    {
        while(k>-1&&mo[k]!=mo[i])
            k=nex[k];
        nex[++i]=++k;
    }
}
int solve(int n,int m)
{
    int i=0,j=0,ans=0;
    while(i<n)
    {
        while(j>-1&&mo[j]!=str[i])
            j=nex[j];
        i++,j++;
        if(j==m)
            ans+=1;
    }
    return ans;
}
int main()
{
    int t;
    scanf("%d
",&t);
    while(t--)
    {
        gets(mo);
        gets(str);
        getnext(strlen(mo));
        printf("%d
",solve(strlen(str),strlen(mo)));
    }
}

 hdu 2087

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int max_=1e6+5;
char str[max_],mo[max_];
int nex[max_];
void getnext(int n)
{
    int i=0,k=-1;
    nex[0]=-1;
    while(i<n)
    {
        while(k>-1&&mo[k]!=mo[i])
            k=nex[k];
        nex[++i]=++k;
    }
}
int solve(int n,int m)
{
    int i=0,j=0,ans=0;
    while(i<n)
    {
        while(j>-1&&mo[j]!=str[i])
            j=nex[j];
        i++,j++;
        if(j==m)
        {
            ans+=1;
            j=0;
        }
    }
    return ans;
}
int main()
{
    while(scanf("%s",str))
    {
        if(str[0]=='#')
            break;
        scanf("%s",mo);
        getnext(strlen(mo));
        printf("%d
",solve(strlen(str),strlen(mo)));
    }
}

hdu  3746

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int max_=1e+5;
int nex[max_];
char str[max_];
void getnext(int n)
{
    int i=0,k=-1;
    nex[0]=-1;
    while(i<n)
    {
        while(k>-1&&str[i]!=str[k])
            k=nex[k];
        nex[++i]=++k;
    }
}
int solve(int n)
{
    if(!nex[n])
        return n;
    else
     {
        int k=n-nex[n];
         if(n%k==0)
            return 0;
         return k-(n%k);
     }
}
int main()
{
    int t;
    scanf("%d
",&t);
    while(t--)
    {
        gets(str);
        int len=strlen(str);
        getnext(len);
        printf("%d
",solve(len));
    }
}

poj 2406

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
const int max_=1e6+5;
char str[max_];
int nex[max_];
void getnext(int n)
{
    int i=0,k=-1;
    nex[0]=-1;
    while(i<n)
    {
        while(k>-1&&str[k]!=str[i])
            k=nex[k];
        nex[++i]=++k;
    }
}
int solve(int n)
{
    int k=n-nex[n];
    if(n%k)
        return 1;
    return n/k;
}
int main()
{
    while(gets(str))
    {
        if(str[0]=='.')
            break;
        int len=strlen(str);
        getnext(len);
        printf("%d
",solve(len));
    }
}
原文地址:https://www.cnblogs.com/linhaitai/p/9879719.html