HDOJ 4821 String
2015-07-14 19:12
302 查看
串hash
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 697 Accepted Submission(s): 190
Problem Description
Given a string S and two integers L and M, we consider a substring of S as “recoverable” if and only if
(i) It is of length M*L;
(ii) It can be constructed by concatenating M “diversified” substrings of S, where each of these substrings has length L; two strings are considered as “diversified” if they don’t have the same character for every position.
Two substrings of S are considered as “different” if they are cut from different part of S. For example, string "aa" has 3 different substrings "aa", "a" and "a".
Your task is to calculate the number of different “recoverable” substrings of S.
Input
The input contains multiple test cases, proceeding to the End of File.
The first line of each test case has two space-separated integers M and L.
The second ine of each test case has a string S, which consists of only lowercase letters.
The length of S is not larger than 10^5, and 1 ≤ M * L ≤ the length of S.
Output
For each test case, output the answer in a single line.
Sample Input
Sample Output
Source
2013 Asia Regional Changchun
String
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 697 Accepted Submission(s): 190
Problem Description
Given a string S and two integers L and M, we consider a substring of S as “recoverable” if and only if
(i) It is of length M*L;
(ii) It can be constructed by concatenating M “diversified” substrings of S, where each of these substrings has length L; two strings are considered as “diversified” if they don’t have the same character for every position.
Two substrings of S are considered as “different” if they are cut from different part of S. For example, string "aa" has 3 different substrings "aa", "a" and "a".
Your task is to calculate the number of different “recoverable” substrings of S.
Input
The input contains multiple test cases, proceeding to the End of File.
The first line of each test case has two space-separated integers M and L.
The second ine of each test case has a string S, which consists of only lowercase letters.
The length of S is not larger than 10^5, and 1 ≤ M * L ≤ the length of S.
Output
For each test case, output the answer in a single line.
Sample Input
3 3 abcabcbcaabc
Sample Output
2
Source
2013 Asia Regional Changchun
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <map> using namespace std; typedef unsigned long long int ull; const int maxn=100100; int L,M; char str[maxn]; ull xp[maxn],hash[maxn]; map<ull,int> ck; void init() { xp[0]=1; for(int i=1;i<maxn;i++) xp[i]=xp[i-1]*175; } ull get_hash(int i,int L) { return hash[i]-hash[i+L]*xp[L]; } int main() { init(); while(scanf("%d%d",&M,&L)!=EOF) { scanf("%s",str); int n=strlen(str); hash =0; for(int i=n-1;i>=0;i--) { hash[i]=hash[i+1]*175+(str[i]-'a'+1); } int ans=0; for(int i=0;i<L;i++) { ck.clear(); int duan=0; for(int j=0;i+(j+1)*L-1<n;j++) { /// i+j*L <---> i+(j+1)*L-1 duan++; ull hahashsh=get_hash(i+j*L,L); ck[hahashsh]++; if(duan>=M) { if(duan>M) { /// M+1 ago : i+(j+1)*L-L*(M+1) ull Mago=get_hash(i+(j+1)*L-L*(M+1),L); if(ck[Mago]) { ck[Mago]--; if(ck[Mago]==0) ck.erase(Mago); } } if(ck.size()==M) ans++; } } } printf("%d\n",ans); } return 0; }
相关文章推荐
- php开发过程中用什么方法来加快页面的加载速度
- spellcheck
- 重载赋值运算符(c/c++)
- BFS、双向BFS和A*
- 答读者问(30):一个大一学生有关未来技术方向的疑问及答复
- 分布式服务框架 Zookeeper
- Sql Server (cast的用法)
- ConcurrentHashMap原理分析
- [LintCode] N-Queens
- Java
- linux编程基础(part2)
- 算法导论 第六章:优先级队列
- C6_函数
- OpenCV函数cvFindContours
- C#文件结构
- Easiest way to use Qhull library in your code.
- PhpStrom常用快捷键
- [leedcode 76] Minimum Window Substring
- android.os.NetworkOnMainThreadException异常
- cocos2d学习之旅(一)