HDU4821 - String(哈希)

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...
摘要由CSDN通过智能技术生成

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
Copy
Sample Output:
2

题意:
给出一个字符串S,再给出两个数M和L,问S中存在多少个长度为M*L的序列,由M个长度为L的子串组成,并且这M个子串各不完全相同。

解法:
首先明确hash值代表的就是字符串,只要存在M个不同的hash值,就存在M个不同的字符串。
对字符串S进行hash,随后i从1枚举到L,j从i枚举到lens-L,每次以L的长度前进,先进行M次枚举,将长度为L的子串的hash值存入map(因为map计算个数时会去重)中,随后每次枚举时放入一个新的hash值,再拿出一个旧的hash值(如果值降到0记得删除该元素,否则会同样被统计入size),只要map中的数的个数达到M,ans++,j枚举完毕后清空map。
注意多测。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stdlib.h>
#include<cstring>
#include<map>
using namespace std;

int m,l;
int lens,ans=0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值