题意:给你一个子串(模式串)和一个母串(文本),问子串在母串中出现的次数。
分析:基础的KMP
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#define SUB_MAX 10005
#define STR_MAX 1000005
char str[STR_MAX] ;
char sub[SUB_MAX] ;
int next[SUB_MAX] ;
int str_len , sub_len ;
void
Find_Next ( )
{
int i , j ;
i = 0 ;
j = -1 ;
next[0] = -1 ;
while ( i < sub_len )
{
if ( -1 == j || sub[i] == sub[j] )
{
i ++ ;
j ++ ;
next[i] = j ;
}
else
{
j = next[j] ;
}
}
return ;
}
void
KMP ( )
{
Find_Next ( ) ;
int count ;
count = 0 ;
int i , j ;
i = j = 0 ;
while ( i < str_len )
{
if ( -1 == j || str[i] == sub[j] )
{
i ++ ;
j ++ ;
}
else
{
j = next[j] ;
}
if ( j == sub_len )
{
count ++ ;
}
}
printf ("%d\n" , count ) ;
return ;
}
int
main ( )
{
int count ;
scanf ("%d" , & count ) ;
while ( count -- )
{
scanf ("%s%s" , sub , str ) ;
sub_len = strlen ( sub ) ;
str_len = strlen ( str ) ;
KMP ( ) ;
}
return 0 ;
}