HDU-剪花布条(kmp)&& HDU-Oulipo(kmp)的区别

来源:互联网 发布:js单选框单击事件 编辑:程序博客网 时间:2024/05/22 16:55

HDU2087-剪花布条
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2087
题目描述:给出父串和子串,问子串在父串中出现的次数

#include<cstdio>#include<cstring>#include<algorithm>#define maxn 1010using namespace std;char fa[maxn], son[maxn];int falen, sonlen;int kmp_next[maxn];void getnext(){    int i = 0, j = -1;    kmp_next[0] = -1;    while (i < falen)    {        if (j == -1 || son[i] == son[j])            kmp_next[i++] = j++;        else            j = kmp_next[j];    }}int kmp_cnt(){    int i = 0, j = 0, cnt = 0;    while (i <= falen)    {        if (j == -1 || fa[i] == son[j]) {            i++;            j++;        }        else            j = kmp_next[j];        if (j == sonlen) {            cnt++;            j = 0;//注意这里:一旦找到一个字串,j就要从子串的第一个字符进行比较。(与下面那题不一样)        }    }    return cnt;}int main(){    int ans;    while (~scanf("%s",fa))    {        ans = 0;        if (fa[0] == '#')            return 0;        scanf("%s", son);        falen = strlen(fa);        sonlen = strlen(son);        getnext();        ans = kmp_cnt();        printf("%d\n", ans);    }    return 0;}

HDU1686-Oulipo
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1686
题目描述:给子串和父串,问子串在父串中出现的次数。(要看案例确定是这两种匹配的哪一种)

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define maxn 1000010using namespace std;char fa[maxn], son[maxn];int falen, sonlen;int kmp_next[maxn];void getnext(){    int i = 0, j = -1;    kmp_next[0] = -1;    while (i < falen)    {        if (j == -1 || son[i] == son[j]) {            i++; j++;            kmp_next[i] = j;        }        else            j = kmp_next[j];        //cout << kmp_next[j] << " ";    }    //cout << endl;}int kmp_cnt(){    int i = 0, j = 0, cnt = 0;    while (i < falen)    {        if (j == -1 || fa[i] == son[j]) {            i++;            j++;        }        else            j = kmp_next[j];        if (j == sonlen) {            cnt++;            j = kmp_next[j];//注意这里:一旦找到一个子串,j就要从父串的next[j]对应字符进行比较。        }    }    return cnt;}int main(){    int ans, n;    while (~scanf("%d", &n))    {        while (n--)        {            scanf("%s", son);            scanf("%s", fa);            falen = strlen(fa);            sonlen = strlen(son);            getnext();            ans = kmp_cnt();            printf("%d\n", ans);        }    }    return 0;}
0 0
原创粉丝点击