2013 Asia Regional Changchun HDU 4821 String (BKDRhash+成段移动法判字符串)
2016-10-17 21:39
253 查看
题目大意:给定一个字符串S,给定两个数M、L,求S中有多少个(M*L)的不同(起始位置不同即可)子串,且满足这个子串的M个L长度的子串,各不相同。
数据范围: 1 <= strlen(S) <= 100000;1 <= M*L <= strlen(S);
题目解答:BKDRhash+成段位移法(复杂度:O(LEN*(LEN / L)) , LEN为字符串S长度)
具体思路是倒序维护一个后缀哈希值,O(LEN)地暴力维护出(类似前缀和求区间值)每个位置起始的长为L的字符串hash值,之后i = 1开始枚举长度L作为起始点,先找到前M个长度L的字符串,用一个map存储不同的hash值个数,然后以这M段为基础,在map中删除第一段的hash值,添加当前M段之后的一段的hash值,按M段移动来维护map,只要map中不同hash值个数为M,则答案+1;
数据范围: 1 <= strlen(S) <= 100000;1 <= M*L <= strlen(S);
题目解答:BKDRhash+成段位移法(复杂度:O(LEN*(LEN / L)) , LEN为字符串S长度)
具体思路是倒序维护一个后缀哈希值,O(LEN)地暴力维护出(类似前缀和求区间值)每个位置起始的长为L的字符串hash值,之后i = 1开始枚举长度L作为起始点,先找到前M个长度L的字符串,用一个map存储不同的hash值个数,然后以这M段为基础,在map中删除第一段的hash值,添加当前M段之后的一段的hash值,按M段移动来维护map,只要map中不同hash值个数为M,则答案+1;
#include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <iostream> #include <algorithm> #include <string> #include <map> using namespace std; const int maxn = 100010; typedef unsigned long long ull; char s[maxn]; ull nbase [maxn]; ull hs[maxn]; ull h[maxn]; ull seed = 31; ///大于字符集大小的质数 int main() { int n, m; nbase[1] = seed; for(int i = 2; i <= maxn; ++i) { nbase[i] = nbase[i-1]*seed; } while(scanf("%d%d", &n, &m) == 2) { scanf("%s", s+1); int len = strlen(s+1); hs[len+1] = 0; for(int i = len; i > 0; --i) ///倒序哈希 { hs[i] = hs[i+1]*seed+s[i]-'a'; } for(int i = 1; i+m-1 <= len; ++i) ///取出L长度的hash值 { h[i] = hs[i]-hs[i+m]*nbase[m]; } int ans = 0; for(int i = 1; i <= m && i+n*m-1 <= len; ++i) { map<ull, int> mp; for(int j = 0; j < n; ++j) { ull th = h[i+j*m]; mp++; } if(mp.size() == n) ans++; for(int j = n; i+((j+1)*m)-1 <= len; ++j) { ull th = h[i+(j-n)*m]; mp --; if(!mp ) mp.erase(th); th = h[i+j*m]; mp ++; if(mp.size() == n) ans++; } } printf("%d\n", ans); } return 0; } 相关文章推荐
- 2013 Asia Regional Changchun I 题,HDU(4821),Hash
- 2013 Asia Regional Changchun HDU 4816 Bathysphere(数学)
- 2013 Asia Regional Changchun HDU 4819 Mosaic (二维线段树)
- HDU-4819 Mosaic (二维线段树)(2013 Asia Regional Changchun)
- hdu 4762 Cut the Cake 概率(2013 ACM/ICPC Asia Regional Changchun Online 1004)
- 2013 Asia Regional Changchun HDU - 4814 Golden Radio Base (进制模拟)
- HDU 4822 Tri-war(LCA树上倍增)(2013 Asia Regional Changchun)
- HDU 4816 Bathysphere(数学)(2013 Asia Regional Changchun)
- hdu 4768 Flyer 二分(2013 ACM/ICPC Asia Regional Changchun Online 1010)
- HDU 4267 A Simple Problem with Integers 2012 ACM/ICPC Asia Regional Changchun Online
- hdu 5444 Elven Postman 树的先序遍历 2015 ACM/ICPC Asia Regional Changchun Online
- hdu 5438 Ponds 拓扑排序+并查集 2015 ACM/ICPC Asia Regional Changchun Online
- 2012 ACM/ICPC Asia Regional Changchun Online(hdu 4267 - 4277)线段树+dp+dfs+树形dp
- HDU 5437 Alisha’s Party(优先队列+模拟)——2015 ACM/ICPC Asia Regional Changchun Online
- 2013 Asia Regional Changchun
- HDU 5443 The Water Problem(水题 找区间最大值)——2015 ACM/ICPC Asia Regional Changchun Online
- hdu 5437 2015 ACM/ICPC Asia Regional Changchun Online 1002 优先队列
- 2013 ACM/ICPC Asia Regional Changchun Online
- hdu 4277 USACO ORZ(2012 ACM/ICPC Asia Regional Changchun Online 长春网络赛)
- hdu 4268 Alice and Bob(2012 ACM/ICPC Asia Regional Changchun Online 12年长春网络赛)