基础KMP, 要注意一次查找完成后,到下一可查找处继续匹配,这样才能保证得到最终个数。
code:
#include<cstdio>
#include<cstring>
char substr[10001] ;
char str[1000001] ;
int next[10001] ;
int sublen, len, ans ;
void get_next(){
next[1] = 0 ;
int j = 0 ;
for(int i=2; i<=sublen; i++){
while(j>0&&substr[j+1]!=substr[i])
j = next[j] ;
if(substr[j+1]==substr[i]) j ++ ;
next[i] = j ;
}
}
void kmp(){
int j = 0 ;
for(int i=1; i<=len; i++){
while(j>0&&substr[j+1]!=str[i])
j = next[j] ;
if(substr[j+1]==str[i]) j ++ ;
if(j==sublen){
ans ++ ;
j = next[j] ; //一次查找完成后,到下一可查找处继续匹配
}
}
printf("%d\n", ans) ;
}
int main(){
int t ;
scanf("%d", &t) ;
while(t--){
scanf("%s", substr+1) ;
scanf("%s", str+1) ;
ans = 0 ;
sublen = strlen(substr+1) ;
len = strlen(str+1) ;
get_next() ;
kmp() ;
}
return 0 ;
#include<cstring>
char substr[10001] ;
char str[1000001] ;
int next[10001] ;
int sublen, len, ans ;
void get_next(){
next[1] = 0 ;
int j = 0 ;
for(int i=2; i<=sublen; i++){
while(j>0&&substr[j+1]!=substr[i])
j = next[j] ;
if(substr[j+1]==substr[i]) j ++ ;
next[i] = j ;
}
}
void kmp(){
int j = 0 ;
for(int i=1; i<=len; i++){
while(j>0&&substr[j+1]!=str[i])
j = next[j] ;
if(substr[j+1]==str[i]) j ++ ;
if(j==sublen){
ans ++ ;
j = next[j] ; //一次查找完成后,到下一可查找处继续匹配
}
}
printf("%d\n", ans) ;
}
int main(){
int t ;
scanf("%d", &t) ;
while(t--){
scanf("%s", substr+1) ;
scanf("%s", str+1) ;
ans = 0 ;
sublen = strlen(substr+1) ;
len = strlen(str+1) ;
get_next() ;
kmp() ;
}
return 0 ;
}