HDOJ 4821 String
来源:互联网 发布:c接收post数据 编辑:程序博客网 时间:2024/05/21 01:57
字符串hash
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.
(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.
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 3abcabcbcaabc
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[n]=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;}
0 1
- HDOJ 4821 String
- HDOJ--4821--String【字符串hash】
- 【字符串hash】 HDOJ 4821 String
- HDOJ 4821 String(字符串hash)
- hdoj 1894 String Compare 【string】
- hdoj 2847 Binary String
- hdoj 2476 String painter
- 【HDOJ】1708 -> Fibonacci String
- hdoj 1306 String Matching
- HDOJ 3374 String Problem
- HDOJ 5533-Hidden String
- hdoj 5672 String 【模拟】
- HDOJ 5672 String
- hdoj-1708-Fibonacci String
- hdoj-4357-String change
- HDOJ 1708 Fibonacci String
- hdoj 2476 String painter(dp)
- HDOJ 3398 String -- 组合 数学
- SQL自定义自增列(通用存储过程)
- 使用virt-p2v工具将物理机迁移到Openstack虚拟机中
- 老鸟的Python入门教程
- UVA 11573 - Ocean Currents(BFS+优先队列)
- 筛选法求素数
- HDOJ 4821 String
- 超级演说家--正能量
- cfs 原理解释
- C++实现设计模式: Factory 工厂模式
- NYOJ 252 01串(dp)
- 新手玩个人服务器(阿里云)
- LINK - MvvmCross依赖注入的实例化
- 这是一个最好的时代
- 英语飙升的好方法