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. 三、线程同步之Sysnchronized关键字

    线程同步 问题引入 观察一面一段小程序: public class Main { private static int amount = 0; public static void main(Stri ...

  2. JSP网页处理过程

    以下步骤表明了Web服务器是如何使用JSP来创建网页的:  就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器. Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎 ...

  3. TADOQuery学习总结

    上一篇讲解了一些TADOQuery的简单的用法,但是还有很多方法没有讲到,这里就直接拿来主义,转载一篇<TADOQuery学习总结>为我所用. 1.Create三种参数的区别 TADOQu ...

  4. C++ 系列:C++ 基础 002

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  5. 将jsp页面转化为图片或pdf(一)

    在项目中遇见了将jsp页面转化为pdf的问题,试过itext,但是itext需要标准的html代码,我的页面中的一些属性是itext所不识别的,所以努力了一段时间后就放弃了,后来发现htmlutil抓 ...

  6. java调用sqlldr oracle 安装的bin目录

    package com.jyc.sqlldr; import java.io.BufferedReader;import java.io.InputStream;import java.io.Inpu ...

  7. 2016多校联合训练4 F - Substring 后缀数组

    Description ?? is practicing his program skill, and now he is given a string, he has to calculate th ...

  8. Delphi的三目运算 ifthen 和iif

    system.Math和system.StrUtils都有IfThen方法, 返回字符串和 返回 数值型 system.Math.IfThen(vehicle.MILE=0,0,StrToFloat( ...

  9. continue语句在for语句和while语句中的区别

    while语句的形式: while( expression ) statement for语句的形式: for( expression1; expression2;expression3 )   // ...

  10. 前端工具 & git笔记

    git diff    (working dir to INDEX ) git diff --cached (INDEX to HEAD) git diff  HEAD  (working dir t ...