hdu 4821 String(hash)
来源:互联网 发布:揭阳网络广告公司 编辑:程序博客网 时间:2024/05/29 14:27
上来先枚举子串,hash了一发,超时,看了看数据,1e5的,不能这样搞了。。看到有博客说以l为一小段来枚举,想了想真是啊,这样时间复杂度就会降到很低。先枚举出一个长度为m*l的子串,然后去掉第一段l,后边加一段l,就是一个新的子串了,枚举到结束后,再从第二个字符开始这样枚举,一直枚举到以第l个字符开头就结束了。这样时间复杂度是O(n)
#include <bits/stdc++.h>using namespace std;typedef unsigned long long ull;const int MAXN = 1e5+10;char str[MAXN];ull h[MAXN];ull pp[MAXN];ull p = 31;map<ull,int> rec;int main(){ int m,l; while(scanf("%d %d",&m,&l) != EOF) { scanf("%s",str); int ll = m*l; int len = strlen(str); pp[0] = 1; h[0] = 0; for(int i = 1; i <= len; ++i) { h[i] = h[i-1]*p + str[i-1]; pp[i] = pp[i-1]*p; } int res = 0; for(int i = 1; i <= l && i+ll-1 <= len; ++i) { rec.clear(); for(int j = i; j+l-1 <= i+ll-1; j += l) rec[h[j+l-1]-h[j-1]*pp[l]]++; if(rec.size() == m) ++res; for(int j = ll+i; j+l-1 <= len; j += l) { rec[h[j-ll+l-1]-h[j-ll-1]*pp[l]]--; if(rec[h[j-ll+l-1]-h[j-ll-1]*pp[l]] == 0) rec.erase(h[j-ll+l-1]-h[j-ll-1]*pp[l]); rec[h[j+l-1]-h[j-1]*pp[l]]++; if(rec.size() == m)++res; } } printf("%d\n",res); } return 0;}
阅读全文
0 0
- hdu-4821-String-HASH
- HDU 4821 String hash
- hdu 4821 String(hash)
- [hdu 4821]String 字符串hash
- HDU 4821 String 字符串hash
- [字符串hash] hdu 4821 String
- HDU 4821 String 字符串HASH
- hdu 4821 String hash乱搞
- HDU 4821 String 字符串HASH
- hdu 4821 String 字符串hash
- HDU 4821 String(Hash)
- hdu 4821 String(枚举 + 字符串hash)
- HDU 4821 String(字符串hash)
- HDU 4821 String 字符串hash(水
- hdu 4821 String(字符串hash+map)
- HDU 4821 String(hash入门题)
- [HDU 4821]String[字符串hash][存疑]
- hdu 4821String(字符串hash)
- 多道批处理系统、分时操作系统
- 动态规划-123. Best Time to Buy and Sell Stock III
- Java 基础(1)—— public class 与 class 的区别
- 逆欧拉函数[arc]
- [codeforces208E]Blood Cousins(dsu on the tree+倍增)
- hdu 4821 String(hash)
- abc
- Android O中Notification 的修改与其使用错误
- what a fuck!这是什么鬼东西?
- UVA
- 欧拉函数求和
- leetcode 363. Max Sum of Rectangle No Larger Than K 动态规划DP + 暴力循环
- POJ 2186 Popular Cows 笔记
- 如何解决maven搭建项目的时候,src/main/java无法建立的问题,提示信息The folder is already a source folder.