第一个KMP的题目,感觉蛮好的,虽然以前也敲过,但是当时不是很理解为什么要这样用,后来知道它的原理后,但是一直没有做过相应的题目,虽然这只是一个基础题,但是这也意味着一个好的开始
上面这个是伪造的KMP,下面那个是KMP的典型模板
上面这个是伪造的KMP,下面那个是KMP的典型模板
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn = 1000010 ;
char str[ maxn ];
int next[ maxn ];
int getnext()
{
int i , j , len ;
i = 0 ;
j = -1 ;
next[ 0 ] = -1;
len = strlen( str ) ;
while( str[ i ] )
{
if( j == -1 || str[ i ] == str[ j ] )
{
i++;
j++;
next[ i ] = j;
}
else
j = next[ j ];
}
i = len - j ;
if( len % i == 0 )
return len / i ;
else
return 1;
}
int main()
{
while( gets(str)&&str[ 0 ] != '.' )
cout<< getnext() << endl ;
return 0 ;
}
kmp中get_next函数使用
// File Name: poj2406.cpp
// Author: bo_jwolf
// Created Time: 2013年04月30日 星期二 19:54:46
#include<vector>
#include<list>
#include<map>
#include<set>
#include<deque>
#include<stack>
#include<bitset>
#include<algorithm>
#include<functional>
#include<numeric>
#include<utility>
#include<sstream>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<ctime>
using namespace std;
const int maxn = 1000000 ;
char str[ maxn ];
int next[ maxn ];
int len ;
void get_next()
{
next[ 0 ] = -1 ;
int j = 0 , k = -1 ;
while( j < len )
{
if( k == -1 || str[ j ] == str[ k ] )
{
j++ ;
k++ ;
next[ j ] = k ;
}
else
k = next[ k ] ;
}
}
int main()
{
while( scanf( "%s" ,&str ) != EOF )
{
if( strcmp( str , "." ) == 0 )
break;
len = strlen( str ) ;
get_next();
if( len % ( len - next[ len ] ) == 0 && len / ( len - next[ len ] ) > 1 )
printf( "%d\n" , len / ( len - next[ len ] ) );
else
printf( "1\n" ) ;
}
return 0;
}