HDU 1686 Oulipo - KID

来源:互联网 发布:linux安装无线网卡驱动 编辑:程序博客网 时间:2024/05/21 07:58

题目大意:

     给你两个字符串,A,B,问A串中有多少个子串是B串。

解题方法:

     简单的字符串hash,不多解释了。

我的代码:

#include <cstdio>#include <string>#include <iostream>#include <cstring>#define hash_t unsigned long longusing namespace std;hash_t BKDRHash(char *str){    hash_t seed = 131; // 31 131 1313 13131 131313 etc..    hash_t hash = 0;    while (*str){        hash = hash * seed + (*str++);    }    return hash;}hash_t acb(hash_t a,hash_t b){  hash_t ans=1;  for (int i=1;i<=b;i++)    ans*=a;  return ans;}int getans(char *s1,char *s2){  int ans=0;  hash_t seed = 131;  hash_t hash1=BKDRHash(s1);  hash_t hash2=0;  int n1,n2;  n1=strlen(s1);n2=strlen(s2);  //cout<<hash1<<endl;  hash_t PPP=acb(seed,n1-1);  for (int i=0;i<n2;i++){      if (i>=n1){        hash2=hash2-(hash_t)s2[i-n1]*PPP;        hash2=hash2*seed+s2[i];        //cout<<hash2<<endl;      }      else {        hash2=hash2*seed+s2[i];      }      if (hash2==hash1) ans++;  }  return ans;}int n;char s1[1000010],s2[1000010];int main (){  //freopen("test.in","r",stdin);  scanf("%d",&n);  while (n--){    scanf("%s",s1);    scanf("%s",s2);    printf("%d\n",getans(s1,s2));  }  return 0;}


0 0
原创粉丝点击