Hash:一般是一个整数。就是说通过某种算法,可以把一个字符串"压缩" 成一个整数。
一,题意:
  给出两个数n,nc,并给出一个由nc种字符组成的字符串。求这个字符串中长度为n的不同子串有多少种?
二,思路:
  1.这个题不用匹配,因为不高效。
  2.将长度为n的子串看作n位的nc进制数,将问题转化为共有多少种十进制数字。
  3.哈希时,每一个字符都对应这0 ~ nc-1的一个数字。
三,步骤:
  1.给nc个字母编号:0 ~ nc-1
    hashArray[ch[i]] = k++;
  2.明确每n个字母ch[i]对应一个n位的nc进制的数hashArray[ch[i]],如:abb---011;
  3.将hashArray[]的nc进制数转换成一个十进制的整数sum,并且使lage[sum]=true标记一下
  4.统计多少个不同的子串。

 #include<iostream>
#include<cstring>
using namespace std;
const int MaxNum = ;
char ch[MaxNum];
bool lage[MaxNum]; //用于标记是否为相同的子串
int hashArray[]; //存储n个字母转换成整数之后再转换成nc进制的数 int main() {
int n, nc;
while (cin >> n >> nc >> ch) {
int k = ;
int len = strlen(ch); //注意此处
for (int i = ; i < len; i++) {
if (hashArray[ch[i]] == ) {
hashArray[ch[i]] = k++; //给nc个字母编号,如hashArray['a']=1
}
}
int ans = ; //记录不同子串的种数
for (int i = ; i <= len - n; i++) {
int sum = ;
for (int j = i; j < i + n; j++) {
sum = sum * nc + hashArray[ch[j]];//将hashArray[]的nc进制数转换成一个十进制的整数sum
}
if (!lage[sum]) { //未出现过为false
ans++;
lage[sum] = true; //出现过的为true
}
}
cout << ans << endl;
}
return ;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

poj1200-Crazy Search(hash入门经典)的更多相关文章

  1. [poj1200]Crazy Search(hash)

    Crazy Search Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26713 Accepted: 7449 Descrip ...

  2. POJ-1200 Crazy Search,人生第一道hash题!

                                                        Crazy Search 真是不容易啊,人生第一道hash题竟然是搜博客看题解来的. 题意:给你 ...

  3. POJ1200 Crazy Search

    Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Description Many peo ...

  4. poj 1200 Crazy Search(hash)

    题目链接:http://poj.org/problem?id=1200 思路分析:从数据来看,该题目使用线性时间算法,可见子串的比较是不可能的:使用hash可以在常数时间内查找,可以常数时间内判重, ...

  5. hdu1381 Crazy Search(hash map)

    题目意思: 给出一个字符串和字串的长度,求出该字符串的全部给定长度的字串的个数(不同样). 题目分析: 此题为简单的字符串哈hash map问题,能够直接调用STL里的map类. map<str ...

  6. POJ1200 A - Crazy Search(哈希)

    A - Crazy Search Many people like to solve hard puzzles some of which may lead them to madness. One ...

  7. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  8. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  9. 转 Kafka入门经典教程

    Kafka入门经典教程 http://www.aboutyun.com/thread-12882-1-1.html 问题导读 1.Kafka独特设计在什么地方?2.Kafka如何搭建及创建topic. ...

随机推荐

  1. mac包管理器Homebrew安装命令

    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

  2. C#调用win32 api 操作其它窗口

    实现以下功能: 找到窗体 找到控件(也叫子窗体) 获取内容 获取位置 设置 位置 内容 鼠标点击 示范 1. 找窗体 以操作系统自带的计算器为例 string clWindow = "Cal ...

  3. 【Java并发系列02】Object的wait()、notify()、notifyAll()方法使用

    一.前言 对于并发编程而言,除了Thread以外,对Object对象的wati和notify对象也应该深入了解其用法,虽然知识点不多. 二.线程安全基本知识 首先应该记住以下基本点,先背下来也无妨: ...

  4. Selenium安装失败WebDriverException: Message: 'gechodriver' executable needs to be in PATH

    在搭建Python+Selenium自动化测试时,用python通过WebDriver驱动Firefox浏览器时,一直无法执行测试用例. 报错信息:WebDriverException: Messag ...

  5. Js实现string.format

    经常需要动态拼接html字符串,想到用类似于.net的string.format函数比较好,于是找了下,stackoverflow的代码: if (!String.prototype.format) ...

  6. [Linux] xargs 和 管道符的区别

    今天刚好遇到需要使用xargs的情况,就来研究一下xargs 和 管道符的区别 举几个例子,下面两个语句执行后的结果是什么呢? 1. zhang$ find . -name "*.prope ...

  7. C# DM5 32位加密

    using System.Security.Cryptography;using System.Text; public static string StringToMD5Hash(string in ...

  8. XOR Swap

    swap(a, b): a ^= b b ^= a a ^= b 先明确一下,a ^ a = 0,同时对于一切数x ^ 0 = x 可以这样理解,第三行: b ^= a b ^= a ^ b b = ...

  9. Java 之 常用类(一)

    1.字符串: a.分类:String.StringBuffer.StringBuilder b.特殊:①String是唯一一个可以直接用常量赋值的引用数据类型 ②String的常量也是一个对象 (即 ...

  10. 解决谷歌浏览器中的input背景色默认是黄色

    input:-webkit-autofill { -webkit-box-shadow: 0 0 0px 1000px white inset !important; }