HDU 2087 剪花布条 裸KMP

2014-11-24 02:44:45 · 作者: · 浏览: 1
中文题,不解释。
裸KMP,注意每次匹配成功要把j移动到0的位置。
代码:
/* 
*  Author:      illuz  
*  Blog:        http://blog.csdn.net/hcbbt 
*  File:        hud2087.cpp 
*  Create Date: 2013-11-28 11:20:11 
*  Descripton:  kmp  
*/  
  
#include   
#include   
  
const int MAXN = 1010;  
  
char T[MAXN], P[MAXN];  
int f[MAXN];  
  
void getVal(int l) {  
    int i = 0, j = -1;  
    f[0] = -1;  
    while (i < l) {  
        if (j == -1 || P[i] == P[j]) {  
            i++;  
            j++;  
            f[i] = j;  
        } else  
            j = f[j];  
    }  
}  
  
int kmp() {  
    int i = 0, j = 0, ans = 0;  
    int lt = strlen(T), lp = strlen(P);  
    getVal(lp);  
    while (i < lt) {  
        if (j == -1 || T[i] == P[j]) {  
            i++;  
            j++;  
        } else  
            j = f[j];  
        if (j == lp) {  
            ans++;  
            j = 0;  
        }  
    }  
    printf("%d\n", ans);  
}  
  
int main() {  
    while (scanf("%s%s", T, P) == 2) {  
        kmp();  
    }  
    return 0;  
}