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
- HDU 1686 Oulipo - KID
- HDU 1686 Oulipo (kmp)
- hdu 1686 Oulipo
- hdu 1686 Oulipo
- hdu 1686 Oulipo
- hdu 1686 kmp Oulipo
- hdu 1686 Oulipo
- KMP hdu-1686-Oulipo
- HDU 1686 Oulipo
- Hdu 1686 Oulipo[kmp]
- hdu 1686 Oulipo(KMP)
- hdu 1686 Oulipo
- HDU-1686-Oulipo(KMP)
- hdu 1686 Oulipo(KMP)
- hdu 1686 Oulipo(KMP)
- HDU - 1686 Oulipo
- HDU 1686 Oulipo (KMP)
- HDU 1686 Oulipo(KMP)
- DOM操作语法(中)
- Ubuntu的手机亮相 - 检查出来
- Ubuntu的手机在今年10月
- Ubuntu的与视窗选择就更好了
- POJ 3020 Antenna Placement(二分图的最大匹配)
- HDU 1686 Oulipo - KID
- css - 不带下划线的超链接
- Ubuntu的供应商受到影响,攻击大多数人
- Ubuntu One的云存储应用的点击数的Mac OS X测试版
- Ubuntu的DHCP和静态IP地址
- 递归及递推问题系列之 放苹果 poj 1664
- 骶髂关节炎的真正的痛苦在后面
- WDF驱动中KMDF与UMDF区别
- 的VSphere - 找出最佳的方式获得最好的服务从企业的互联网托管