花生闽南叫土豆吧 关注:4贴子:98
  • 0回复贴,共1

KMP算法备份

只看楼主收藏回复

#include<string.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
int index_KMP(char *s,char *t,int pos);
void get_next(char *t,int *next);
int a[100000000];
int b[100000000];
char s[100];
char t[3]="13";
int next[100];
int pos=0;
int main()
{
     int num;
     memset(b,0,sizeof(b));
     for(int i=1;i<=10000/13;i++)
     {
         a[i]=i*13;
     }
     for(int j=1;j<=10000/13;j++)
     {
         int n;
         sprintf(s,"%d",a[j]);
         get_next(t,next);
         n=index_KMP(s,t,pos);
         if(n!=0)
         {
             b[j]=b[j-1]+1;
         }
         else
         {
             b[j]=b[j-1];
         }
     }
     while(cin>>num)
     cout<<b[num/13]<<endl;
     return 0;
}
int index_KMP(char *s,char *t,int pos)
{
     int i=pos,j=1;
     while (i<=(int)strlen(s)&&j<=(int)strlen(t))
     {
         if (j==0||s[i]==t[j-1])
         {
             i++;
             j++;
         }
         else j=next[j];
     }
     if (j>(int)strlen(t))
         return i-strlen(t)+1;
     else
         return 0;
}
void get_next(char *t,int *next)
{
    
     int i=1,j=0;
     next[0]=next[1]=0;
     while (i<(int)strlen(t))
     {
         if (j==0||t[i]==t[j])
         {
             i++;
             j++;
             next[i]=j;
         }
         else j=next[j];
     }   
}



IP属地:福建1楼2010-09-18 17:27回复