hdu 1686 Oulipo

来源:互联网 发布:注册表禁止安装软件 编辑:程序博客网 时间:2024/06/08 14:16

本题链接:点击打开链接

       本题是求一个主字符串中有多少个子字符串,先输入的是子字符串;本题解法呢,就是采用KMP算法,先对子字符串本身进行编号,首字符标为-1,第二个字符标为0,然后下一位的标法遵循一个准则:若前一位与其所对应下标对应的字符相等,则标记为前一个字符的下标值加一,若不等,则将前一位与刚所比较那个字符对应下标所对应的字符相比较,直至比较到子字符串首,若仍不等,则此字符的下标应为0;对子字符串标号完毕就可以进行与主字符串的比较了,此法效率较高。

参考代码:

#include<stdio.h>#include<string.h>#define LEN 1000010char str[LEN], buf[LEN];int p[LEN];int lens,lenb,cnt;void getnext(){int i=0,j=-1;p[0]=-1;while(i<lens){if(j==-1||str[i]==str[j]){i++;j++;p[i]=j;}else j=p[j];}}void kmp(){int i=0,j=0;while(i<lenb){if(j==-1||str[j]==buf[i]){i++;j++;if(j==lens)cnt++;}elsej=p[j];}}int main(){int T;scanf("%d",&T);while(T--){cnt=0;scanf("%s%s",str,buf);lens=strlen(str);lenb=strlen(buf);getnext();kmp();printf("%d\n",cnt);}return 0;}

0 0