NYOJ5. Binary String Matching(KMP模板題)
阿新 • • 發佈:2018-12-24
Binary String Matching
時間限制:3000 ms | 記憶體限制:65535 KB難度:3- 描述
- Given two strings A and B, whose alphabet consist only ‘0’ and ‘1’. Your task is only to tell how many times does A appear as a substring of B? For example, the text string B is ‘1001110110’ while the pattern string A is ‘11’, you should output 3, because the pattern A appeared at the posit
- 輸入
- The first line consist only one integer N, indicates N cases follows. In each case, there are two lines, the first line gives the string A, length (A) <= 10, and the second line gives the string B, length (B) <= 1000. And it is guaranteed that B is always longer than A.
- 輸出
- For each case, output a single line consist a single integer, tells how many times do B appears as a substring of A.
- 樣例輸入
3 11 1001110110 101 110010010010001 1010 110100010101011
- 樣例輸出
3 0 3
【分析】串的模式匹配
題意:輸入串A(模式串)和串B(主串),問串A在串B中出現了幾次。
這裡使用更高效的KMP演算法實現,稍作修改即可實現串A出現次數的統計。
#include <stdio.h> #include <string.h> #define maxlenA 15 #define maxlenB 1005 int N; //next陣列-模式串部分匹配資訊 //next[i]表示模式串的第i個字元與主串B中相應字元"失配"時, //模式串A中需重新和主串B中該字元進行比較的字元位置 int next[maxlenA]; char A[maxlenA],B[maxlenB]; //A-模式串 B-主串 //求模式串A的部分匹配資訊 void getNext(char *s,int *next) { int i,j,len; i=0,j=-1; len=strlen(s); //規定next[0]=-1 next[i]=j; //打表 while(i<len) { if(j==-1 || s[i]==s[j]) { i++; j++; next[i]=j; } else j=next[j]; } } //主串s 模式串t,統計模式串t在主串s中的出現次數 void KMP(char *s,char *t) { int i,j; int lens,lent;//主串s和模式串t的長度 int ans; //模式串t在主串s中的出現次數 i=j=ans=0; lens=strlen(s); lent=strlen(t); getNext(A,next); while(i<lens && j<lent) { //j在模式串第一個字元前 或 主串和模式串對應位置字元相同,則向後考察 if(j==-1 || s[i]==t[j]) { i++; j++; } //否則,j回到重新和主串s匹配的位置 else j=next[j]; //匹配成功,i不動,j從next[j]位置開始繼續與主串s匹配 if(j>=lent) { ans++; j=next[j]; } } printf("%d\n",ans); } int main() { int i; scanf("%d",&N); while(N--) { scanf("%s",A); scanf("%s",B); KMP(B,A); } return 0; }