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