hdu 4821 ||2013年長春站J題 字串雜湊+map的應用
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 3
abcabcbcaabc
Sample Output
2
給定一個字串在其中找出子串長度 m*l,並且該字串可分為m段每段長度均為l,求有多少個這樣的子串。
解題思路:
利用雜湊算出每個子串的雜湊值,利用map,注意不能直接暴力一遍,會超時,技巧在程式碼。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <map>
//#define debug
using 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 3
abcabcbcaabc
Sample Output
2
相關文章
- 字串雜湊字串
- 雜湊表應用
- 2012長春站D題||hdu4424 並查集並查集
- 字串雜湊表字串
- 雜湊表(Hash)的應用
- 字串查詢(字串雜湊)字串
- 【字串】 優雅的暴力——字串下的雜湊判重問題字串
- (字串雜湊表)找到字串中不重複出現字元的最長子串長度字串字元
- SCU 4438 Censor (字串雜湊)字串
- 幾道和雜湊(雜湊)表有關的面試題面試題
- HDU5183Negative and Positive (NP)(雜湊表)
- js 雜湊雜湊值的模組JS
- P3370 【模板】字串雜湊字串
- 雜湊資料結構以及在HashMap中的應用資料結構HashMap
- 22 | 雜湊演算法(下):雜湊演算法在分散式系統中有哪些應用?演算法分散式
- HDU5441 Travel (2015年長春網路賽,並查集)並查集
- 洛谷題單指南-集合-P3370 【模板】字串雜湊字串
- 雜湊表(雜湊表)詳解
- 雜湊
- 安全的雜湊
- 雜湊表(雜湊表)原理詳解
- 【尋跡#3】 雜湊與雜湊表
- 2013成都站F題||hdu4786 並查集 生成樹並查集
- leetcode 1525 字串的好分割數目(雜湊表,字串分割)LeetCode字串
- MD5雜湊長度延展攻擊
- 查詢(3)--雜湊表(雜湊查詢)
- 雜湊遊戲之雜湊盒子的趨勢未來可期遊戲
- Java春招面試複習:有關於Java Map,應該掌握的8個問題Java面試
- hdu5445 || 2015長春網路賽1009題 多重揹包問題
- 雜湊表的原理
- linux命令列印字串md5雜湊後的值Linux命令列字串
- 樹雜湊
- 雜湊碰撞
- 雜湊表
- 【六褘-Java】雜湊演算法記憶體圖;set集合低層採用雜湊表儲存元素;雜湊演算法的流程Java演算法記憶體
- 用Objective-C實現雜湊表Object
- 雜湊函式函式
- redis之雜湊Redis