一道写了三小时的水题。
将子串转化为nc进制的整数来判断。
注意字符并不是按顺序来的。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_SET = 16000000;
const int N = 1000000;
char s[N];
bool visit[MAX_SET];
int _calculate(char *, int, int, int);
void ch_to_int(char *);
int main()
{
int n;
int len_sub;
int len_str;
int tot_sub;
scanf("%d %d %s", &len_sub, &n, s);
len_str = strlen(s);
ch_to_int(s);
tot_sub = _calculate(s, len_sub, len_str, n);
printf("%d", tot_sub);
return 0;
}
void ch_to_int(char *s)
{
int cnt = 0;
int value[256];
memset(value, -1, sizeof(value));
for ( ; *s != '\0'; s++)
{
if (value[*s] == -1)
value[*s] = cnt++;
*s = value[*s];
}
}
int _turn(char *start, char *end, int n)
{
unsigned int val = 0;
while (start != end)
val = val * n + *start++;
return val;
}
int _calculate(char *s, int len_sub, int len_str, int n)
{
int cnt;
int temp;
char *ps;
cnt = 0;
ps = s;
memset(visit, 0, sizeof(visit));
while (ps + len_sub <= s + len_str)
{
temp = _turn(ps, ps+len_sub, n);
if (!visit[temp])
{
visit[temp] = true;
cnt++;
}
ps++;
}
return cnt;
}