poj1200(字符串哈希)
来源:互联网 发布:淘宝美化图片的软件 编辑:程序博客网 时间:2024/04/24 12:03
点击打开题目链接
题意就是,给出一个字符串,里面有NC个不同字符,求其中长度为n的不同子字符串个数
差不多就是字符串的哈希算法的一道简单应用题了,《挑战程序设计竞赛》书上第373页开始有相关内容
其中,假设字符串C=c1c2...cm,选取两个合适的互素常数b和h,可定义哈希函数
H(c)=(c1*b^(m-1)+c2*b^(m-2)+c2*b^(m-3)+...+cm*b^0) mod h
其中b是基数,相当于把字符串看作b进制数。这样,字符串S=s1s2...sn从位置k+1开始长度为m的字符串子串
S[k+1...k+m]的哈希值,就可以从位置k开始的字符串子串S[k...k+m-1]的哈希值,直接进行如下计算。
H(S[k+1...k+m])=(H(S[k...k+m-1])*b-sk*b^m+sk+m) mod h
这道题里,转换下,len-n+1个子字符串对应len-n+1个哈希值,求不同子字符串个数就相当于求不同哈希值个数
其他的,再利用Java带的数据结构套套,即可解决,代码如下:
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.Reader;import java.util.HashMap;import java.util.HashSet;import java.util.StringTokenizer;public class Main {/** * @param args */static long nnum, val, value;static int n, nc, cnt;static BufferedReader reader;static StringTokenizer tokenizer;static String str, str2;static char ch[];static HashSet<Integer> hashSet;static HashMap<Character, Integer> hashMap;static long monum = Integer.MAX_VALUE;static long mulnum = 100000007;static long num[];public static void main(String[] args) throws IOException {// TODO Auto-generated method stubreader = new BufferedReader(new InputStreamReader(System.in));tokenizer = new StringTokenizer("");str2 = reader.readLine();tokenizer = new StringTokenizer(str2);n = Integer.parseInt(tokenizer.nextToken());nc = Integer.parseInt(tokenizer.nextToken());str = reader.readLine();ch = str.toCharArray();hashSet = new HashSet<Integer>();num = new long[ch.length];hashMap = new HashMap<Character, Integer>();if (n > ch.length)System.out.println(0);else {value = 1;for (int i = 0; i < n; i++) {if (!(hashMap.containsKey(ch[i]))) {cnt++;hashMap.put(ch[i], cnt);num[i] = cnt;} elsenum[i] = hashMap.get(ch[i]);val = (val * mulnum + num[i]) % monum;value = (value * mulnum) % monum;}hashSet.add((int) val);for (int i = n; i < ch.length; i++) {if (!(hashMap.containsKey(ch[i]))) {cnt++;hashMap.put(ch[i], cnt);num[i] = cnt;} elsenum[i] = hashMap.get(ch[i]);val = (val * mulnum + num[i]) % monum;val = ((val - value * num[i - n]) % monum + monum) % monum;hashSet.add((int) val);}System.out.println(hashSet.size());}}}
0 0
- poj1200(字符串哈希)
- poj1200 Crazy Search——字符串哈希
- (简单哈希)POJ1200
- poj1200(字符串hash)
- poj1200(字符串hash,!!!
- POJ1200 Crazy Search (字符串hash)
- poj1200
- poj1200
- poj1200
- POJ1200
- poj1200
- POJ1200
- poj1200 Crazy Search,字符串hash or 后缀数组
- poj1200 哈希
- POJ1200 Hash
- poj1200 Crazy Search
- POJ1200 Crazy Search
- POJ1200-Crazy Search
- 【bzoj2453】维护队列
- JAVA中protected的作用
- 【编译原理】高级语言及其语法描述
- Matlab C混合编程配置
- 博客测试
- poj1200(字符串哈希)
- 第12期 《田家少闲月》5月刊
- vim和ctags配置(ubuntu)
- 【Java】多线程通信
- Java插入排序(1、直接插入排序2、希尔排序)
- Error:incomplete type is not allowed
- Android ListView中CheckBox取值问题
- LeetCode 49. Group Anagrams
- 2017 CCPC-WFinal&&HDOJ 6024 Building Shops