题意:给你一个字符串,里面有nc个字符,要你求里面连续长度为n的子串
思路:第一种解法最简单,把他们全部截下来放进一个set里~~最后求set的size()即可~~第二种解法比第一种快多了~用RK算法,全部依次哈希了,然后记录下来,叫神马滚动哈希
AC代码:(HashSet)
import java.util.HashSet;
import java.util.Scanner;
public class Main
{
static Scanner scan=new Scanner(System.in);
public static void main(String[] args)
{
int n=scan.nextInt();
int nc=scan.nextInt();
int max=(int)Math.pow(nc,n);
HashSet<String> hash=new HashSet<String>();
String s=scan.next();
int m=s.length()-n+1;
for(int i=0;i<m;i++)
{
hash.add(s.substring(i,i+n));
if(hash.size()==max) break;
}
System.out.println(hash.size());
}
}
AC代码:(RK算法)
import java.util.Scanner;
public class Main
{
static Scanner scan=new Scanner(System.in);
public static void main(String[] args)
{
int n=scan.nextInt();
int nc=scan.nextInt();
char a[]=scan.next().toCharArray();
boolean hash[]=new boolean[16000001];
int ary[]=new int[257];
int m=a.length,seed=0,sum=0,ans=0;
for(int i=0;i<m;i++)
if(ary[a[i]]==0)
{
ary[a[i]]=++seed;
if(seed==nc) break;
}
for(int i=0;i<=m-n;i++,sum=0)
{
for(int j=0;j<n;j++)
sum+=sum*nc+ary[a[i+j]];
if(!hash[sum])
{
hash[sum]=true;
ans++;
}
}
System.out.println(ans);
}
}