这个题巨坑的有没有。。java,so easy。set或者map 就可以过的说。。。
C++是hash。。。结果卡了很久。。。。周赛想了想就没做这个。。。然后把所有的方法都对着写了一遍
这是hash的第一题,其实还不是很明白hash的用法。
题意就是有1-nc个字母【按照字典序】,然后问里面长度为n的互异的子串有几个。
C++代码如下
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define eps 1e-5
const int maxn=20000006;
const int maxm=110037;
#define INF 1000000000
using namespace std;
int mode=100000003;
char s[maxn];
bool vis[maxn];
int asc[257];
int main()
{
int n,nc;
scanf("%d%d",&n,&nc);
scanf("%s",s);
int ans=0,x=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
asc[s[i]]=1;
}
for(int i=0;i<256;i++)
{
if(asc[i])
asc[i]=x++;
}
for(int i=0;i<len-n+1;i++)
{
int f=0;
for(int j=0;j<n;j++)
f=f*nc+asc[s[i+j]];
if(!vis[f])
ans++,vis[f]=1;
}
printf("%d\n",ans);
}
java的map
import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int nc=scan.nextInt();
String str=scan.next();
System.out.println(solve(str,n));
}
public static int solve(String str,int len)
{
int count=0;
int strl=str.length();
HashMap<Integer,Integer> letter=new HashMap<Integer,Integer>(100000);
int hash=0;
for(int i=0;i<strl-(len-1);i++)
{
String temp=str.substring(i,i+len);
hash=temp.hashCode();
if(letter.get(hash)==null)
{
letter.put(hash, 1);
count++;
}
}
return count;
}
}
java的set【多谢石大神教我用set】
package contest0518;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class D
{
public static void main(String[]args)
{
Scanner scan = new Scanner(System.in);
int n = scan.nextInt(), nc = scan.nextInt();
String s = scan.next();
String [] str = new String[s.length() - n + 1];
for (int i = 0; i < s.length() - n + 1; i++)
{
str[i] = s.substring(i, i + n);
}
Set set = new HashSet();
for (int i = 0; i < s.length() - n + 1; i++)
{
set.add(str[i]);
}
System.out.println(set.size());
}
}
代码量。。。。一目了然。。【T_T】