hdu1711(kmp纯模板)

15103754_dZTB.gif 15103754_x5wf.gif View Code

    
void get_next()
{
int i =- 1 ,j = 0 ;
next[
0 ] =- 1 ;
while (j < m - 1 )
{
if (i ==- 1 || b[i] == b[j]) { ++ i; ++ j; next[j] = i;}
else i = next[i];
}
}
int Index_KMP()
{
int i = 0 ,j = 0 ;
while (i < n && j < m)
{
if (a[i] == b[j] || j ==- 1 ) { ++ i; ++ j;}
else j = next[j];
}
if (j >= m) return i - m + 1 ;
else return - 1 ;
}

代码:

15103754_dZTB.gif 15103754_x5wf.gif View Code

    
#include < iostream >
#define M 10001
#define N 1000001
using namespace std;
__int64 a[N],b[M];
int next[M];
int t,n,m;
void get_next()
{
int i =- 1 ,j = 0 ;
next[
0 ] = - 1 ;
while (j < m - 1 )
{
if (i ==- 1 || b[i] == b[j])
{
i
++ ;
j
++ ;
next[j]
= i;
}
else i = next[i];
}
}

int Index_KMP()
{
int i = 0 ,j = 0 ;
while (i < n && j < m)
{
if (a[i] == b[j] || j ==- 1 )
{
i
++ ;
j
++ ;
}
else j = next[j];
}
if (j >= m) return i - m + 1 ;
else return - 1 ;
}
int main()
{

int i,j;
scanf(
" %d " , & t);
while (t -- )
{
scanf(
" %d%d " , & n, & m);

for (i = 0 ;i < n;i ++ ) scanf( " %d " , & a[i]);
for (i = 0 ;i < m;i ++ )scanf( " %d " , & b[i]);
get_next();
printf(
" %d\n " ,Index_KMP());

}
return 0 ;
}

转载于:https://my.oschina.net/garyun/blog/602885

猜你喜欢

转载自blog.csdn.net/weixin_33928467/article/details/91774111