FZU 2275-KMP

来源:互联网 发布:java 反射找不到注解 编辑:程序博客网 时间:2024/05/29 16:50

题目链接

这是一道字符串匹配题,如果使用一般的字符串匹配会超时,所以可以采用KMP算法来减小时间复杂度,感谢只有你和v_JULY_v的博客。

#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;char s[1000005], t[1000005], tmp[1000005];int nextl[1000005];int ls, lt;void getnext(){    nextl[0] = -1;    for (int i = 1; i<lt; i++)    {        int j = nextl[i - 1];        while (t[j + 1] != t[i] && j>-1)            j = nextl[j];        nextl[i] = (t[j + 1] == t[i]) ? j + 1 : -1;    }}int kmp(char *a, char *b){    getnext();    int sum = 0, i = 0, j = 0;    while (i<ls&&j<lt)    {        if (j == -1 || a[i] == b[j])            i++, j++;        else            j = nextl[j];    }    if (j == lt)        return 1;    return 0;}int main(){    int n;    cin >> n;    while (n--)    {        cin >> s >> t;        ls = strlen(s), lt = strlen(t);        if (ls<lt)        {            printf("Bob\n");            continue;        }        if (kmp(s, t) || !strcmp(t, "0"))        {            printf("Alice\n");            continue;        }        reverse(t, t + lt);        if (kmp(s, t))        {            printf("Alice\n");            continue;        }        printf("Bob\n");    }    return 0;}

KMP模板

void getnext(){    next[0]=-1;    for(int i=1;i<n;i++)    {        int j=next[i-1];        while(t[j+1]!=t[i]&&j>-1)            j=next[j];        next[i]=(t[j+1]==t[i])?j+1:-1;    }}int kmp(){    int i=j=0;    while(i<slen&&j<plen)    {        if(j==-1||s[i]==p[j])            i++,j++;        else            j=next[j];     }    return (j==plen)?i-j:-1;}
原创粉丝点击