HDU 4847 KMP

原题链接http://acm.hdu.edu.cn/showproblem.php?pid=4847

题解:这道题目简单看,就是从一篇文章中统计出某个单词的个数,简单做就是朴素字符串匹配问题。

代码如下:

#include
#include
using namespace std;
int main() {
	char ch[50000];
	int sum = 0;
	while (cin >> ch) {
		int len = strlen(ch);
		for (int i = 0;i < len - 3;i++) {
			if ((ch[i] == 'D' || ch[i] == 'd')
				&& (ch[i + 1] == 'O' || ch[i + 1] == 'o')
				&& (ch[i + 2] == 'G' || ch[i + 2] == 'g')
				&& (ch[i + 3] == 'E' || ch[i + 3] == 'e'))
				sum++;
		}
	}
	cout << sum << endl;
}

另一种比较高端的做法就是KMP(线性时间字符串比配),该算法的核心就是要求Next数组(子段的真后缀的整段的最长前缀),也是就是求各个字段的前缀跟后缀相等的长度。

代码1:Next数组的索引从0开始:

#include
#include 
#include 
#include 
using namespace std;

int Next[6];
char T[1000];
char P[10] = "doge";
int Plen = strlen(P);
int Tlen, cnt;

void get_val(){
    Next[0] = -1;
    int k = -1;
    for (int i = 1;i < Plen;i++) {
        while (k > -1 && P[k + 1] != P[i])
            k = Next[k];
        if (P[k + 1] == P[i])
            k++;
        Next[i] = k;
    }
}

void KMP(){
    int k = -1;
    Tlen = strlen(T);
    for (int i = 0;i < Tlen;i++) {
        while (k > -1 && !(P[k + 1] == T[i] || T[i] == P[k + 1] - 32))
            k = Next[k];
        if (P[k + 1] == T[i]|| T[i] == P[k+1] - 32)
            k++;
        if (k == Plen - 1) {
            k = -1;
            cnt++;
        }
    }
}

int main(){
    //freopen("data.txt", "r", stdin);
    get_val();
    cnt = 0;
    while (gets_s(T))
    {
        KMP();
    }
    printf("%d\n", cnt);
    //freopen("CON", "r", stdin);
    //system("pause");
    //system("pause");
    return 0;
}
代码2:Next数组索引从1开始Next:

#include
#include 
#include 
#include 
using namespace std;

int Next[6];
char T[1000];
char P[10] = "doge";
int Plen = strlen(P);
int Tlen, cnt;

void get_val(){
    Next[0] = -1;
    int j = 0, k = -1;
    while (j < Plen)
    {
        if (k == -1 || P[j] == P[k])
        {
            j++;
            k++;
            Next[j] = k;
        }
        else
            k = Next[k];
    }
}

void KMP(){
    int j = 0, i = 0;
    Tlen = strlen(T);
    while (i < Tlen){    /* T[i] == P[j] - ('a' - 'A') ||*/
        if (j == -1){
            i++;
            j++;
        }
        else if (T[i] == P[j] || T[i] == P[j] -32){
            i++;
            j++;
        }
        else
            j = Next[j];
        if (j == Plen){
            cnt++;
            j = 0;
        }
    }
}

int main(){
    get_val();
    cnt = 0;
    while (gets_s(T))
    {
        KMP();
    }
    printf("%d\n", cnt);
    return 0;
}



你可能感兴趣的:(HDU)