hdu 2203 亲和串

来源:互联网 发布:淘宝直通车怎么进入 编辑:程序博客网 时间:2024/06/01 09:17

在s1中通过循环移位,使s1包含s2

直接暴搜,

for(int i=0;i<la;i++)

{

if(s1[i]==s2[0])

for(int j=1,k=i+1;j<lb;j++,k++)

{

if(s1[k%la]!=s2[j])

break;

}

}

kmp模板

模式匹配

kmp中next数组表示如果当前匹配不成功,匹配串移动到的位置,不考虑移动到的位置的数与当前位置数的关系。

kmp中nextval数组表示如果当前匹配不成功,匹配串移动到的位置,考虑移动到的位置的数与当前位置数的关系。


1.获取模式串next数组

<pre name="code" class="cpp">void getnext(char *pat)  {      int lp = strlen(pat);      int i = 0;      int j = -1;      next[0] = -1;      while(i < lp)      {          if(j == -1 || pat[i] == pat[j])          {              i++;              j++;              next[i] = j;          }          else              j = next[j];      }    }<span style="font-family: Arial, Helvetica, sans-serif;"> </span>

2.nextval数组

void getnextval(char *str)  {      int len = strlen(str);      int i = 0;      int j = -1;      next[0] = -1;       while(i<len)      {          if(j==-1||str[i]==str[j])          {              i++;j++;              if(str[i]!=str[j])next[i]=j;              else next[i]=next[j];          }          else j=next[j];      }    }

3.kmp

如果不匹配模式串回到j=next[j]继续匹配

用kmp代码:

#include <iostream>#include <cstring>#include <cstdio>using namespace std;int next[100010];char a[200010],b[100010];void getnext(char *pat){    int len_pat = strlen(pat);    int i = 0;    int j = -1;    next[0] = -1;    while(i < len_pat)    {        if(j == -1 || pat[i] == pat[j])        {            i++;            j++;            next[i] = j;        }        else            j = next[j];    }}int kmp(char *str, char *pat){    int i = 0;    int j = 0;    int len_str = strlen(str);    int len_pat = strlen(pat);    getnext(pat);    while(i < len_str)    {        if(j == -1 || str[i] == pat[j])        {            i++;            j++;        }        else            j = next[j];        if(j >= len_pat)            return 1;    }    return 0;}int main(){    int len_a,len_b,i;    while(~scanf("%s%s",a,b))    {        len_a = strlen(a);        len_b = strlen(b);        if(len_a < len_b)        {            printf("no\n");            continue;        }        for(i = 0; i <len_a; i++)            a[i+len_a] = a[i];        a[i+len_a] = '\0';        if(!kmp(a,b))            printf("no\n");        else            printf("yes\n");    }    return 0;}


0 0