hdu 4821 ||2013年长春站J题 字符串哈希+map的应用
来源:互联网 发布:淘宝店招代码生成器 编辑:程序博客网 时间:2024/05/21 08:45
http://acm.hdu.edu.cn/showproblem.php?pid=4821
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
给定一个字符串在其中找出子串长度 m*l,并且该字串可分为m段每段长度均为l,求有多少个这样的子串。
解题思路:
利用哈希算出每个子串的哈希值,利用map,注意不能直接暴力一遍,会超时,技巧在代码。
#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <map>//#define debugusing namespace std;typedef unsigned long long ULL;const int SIZE = 100003;const int SEED = 13331;const int MAX_N = 110000 + 10;char s[MAX_N];struct HASH{ ULL H[MAX_N]; ULL XL[MAX_N]; int len; HASH(){} void build(char *s){ len=strlen(s); H[len]=0; XL[0]=1; for (int i=len-1;i>=0;i--){ H[i]=H[i+1]*SEED+s[i]; XL[len-i]=XL[len-i-1]*SEED; } } ULL hash(int i,int L){ return H[i]-H[i+L]*XL[L]; }}hs;char a[100005];int n,m,cnt;map<ULL,int> p;int main(){ while(~scanf("%d%d",&n,&m)) { scanf("%s",a); hs.build(a); int len=strlen(a); cnt=0; for(int i=0;i<m&&i<=(len-n*m);i++) { p.clear(); for(int j=i;j<i+n*m;j+=m) p[hs.hash(j,m)]++; if(p.size()==n) cnt++; for(int j=i+n*m;j<=len-m;j+=m) { p[hs.hash(j-n*m,m)]--; if(p[hs.hash(j-m*n,m)]==0) p.erase(hs.hash(j-m*n,m)); p[hs.hash(j,m)]++; if(p.size()==n) cnt++; } } printf("%d\n",cnt); } return 0;}
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
0 0
- hdu 4821 ||2013年长春站J题 字符串哈希+map的应用
- HDU 4768 Flyer(13年长春网络赛-J题-二分)
- HDU 4768 Flyer(13年长春网络赛-J题-二分)
- HDU 5446 Unknown Treasure (2015年长春赛区网络赛J题)
- 2012年长春站H题 ||hdu 4427 dp
- 2013年长春站C题 背包+概率
- HDU 4275 Color the Tree 树的Hash 2012年长春网络赛I题
- HDU 4818 RP problem (2013年长春现场赛F题) 高斯消元性质利用
- HDU 4818 RP problem (高斯消元, 2013年长春区域赛F题)
- hdu 1075 map 的应用可以字符串的hash
- Hdu Excuses, Excuses! 字符串处理 map应用
- 2013年长春网络赛
- 2013年长春区域赛
- HDU 2648 map的应用
- zoj_3657,12年长春站c题,模拟
- HDU 5445 Food Problem (2015年长春站网络赛1009 多重背包DP)
- HDU 4427 Math Magic (2012年长春现场赛H题)
- HDU 5441 Travel (2015年长春赛区网络赛E题)
- 小积累
- android studio 中配置 android annotation
- css样式
- esql常用语法示例
- linux 进程监控和自动重启的简单实现
- hdu 4821 ||2013年长春站J题 字符串哈希+map的应用
- sqlserver数据库迁移到mysql的方法和步骤
- Python死锁问题查找
- EXC_BAD_ACCESS报错解决方法之--NSZombieEnabled
- Linux中构建NTP服务器
- 开通CSDN博客的第一天,为远逝的秋,成就心中所想。 .
- Themida和Winlicense加壳软件脱壳教程
- 【新闻发布系统】——存储过程
- 金属材料工程专业大学生个人职业生涯规划