问题描述:给出一个字符串,包含nc个不同字符组成,求这个字符串中长度为n的子串(不包括重复的)的数量。题目中假设字串数目不超过16 000 000 个。输入第一行包含两个数字n ,nc,第二行输入字符串。输出符合要求的子串个数。
输入:
3 4
daababac
输出:
5
题目中所说的字符串字符个数为nc,则可以将其所有长度为n的字符串Hash为nc进制的整数。首先要处理的是给nc个不同字符Hash一个值;
#include<iostream>
#include<string>
using namespace std;
#define Size 16000003
string s;
bool Hash[Size]; //记录是否出现
int Id[500]; //记录每个字符表示的数字
int main(){
int n, nc, i,j,pos,ans;
while (cin>>n>>nc>>s){
ans = 0;
memset(Id, -1, sizeof(Id)); //统一标记为-1
for (i = 0; i < s.size() && ans < nc; i++){
if (Id[s[i]] != -1)
continue; //已有值
Id[s[i]] = ans++; //赋值
}
/*以上给nc种不同的字符串赋值*/
mem