题目链接

Description

Many people like to solve hard puzzles some of which may lead them to madness. One such puzzle could be finding a hidden prime number in a given text. Such number could be the number of different substrings of a given size that exist in the text. As you soon will discover, you really need the help of a computer and a good algorithm to solve such a puzzle.

Your task is to write a program that given the size, N, of the substring, the number of different characters that may occur in the text, NC, and the text itself, determines the number of different substrings of size N that appear in the text.

As an example, consider N=3, NC=4 and the text "daababac". The different substrings of size 3 that can be found in this text are: "daa"; "aab"; "aba"; "bab"; "bac". Therefore, the answer should be 5.

Input

The first line of input consists of two numbers, N and NC, separated by exactly one space. This is followed by the text where the search takes place. You may assume that the maximum number of substrings formed by the possible set of characters does not exceed 16 Millions.

Output

The program should output just an integer corresponding to the number of different substrings of size N found in the given text.

Sample Input

3 4

daababac

Sample Output

5

分析:

给定一个有nc个不同的字符组成的字符串,然后询问这个字符串里面有多少个长度为n的不完全相同的子串。

首先想到的就是对于这个字符串使用字符串截取函数获取每一个子串,然后利用map来判重。但是这样的话时间会超时,转换一下利用hash的思想来求解。

明确指出是该字符串由nc个不同的字符组成,我们将这nc个字符串对应成nc进制,对应的时候与字符的ASCLL码表没有关系,至于该字符第一次在字符串中出现的顺序有关(当然这个可以根据自己的习惯来定义)

例如题目上给出的:daababac

对应成 4进制后是:01121213

然后根据转换后的进制数,将每一个子串对应成一个一一对应的数字,就可以利用hash在O(1)的时间内进行判重,会大大减少时间。

需要注意的一点就是,因为我们是按照nc进制来求数值的,而不是习惯所有的10进制,说以应该乘上的是nc。

代码:

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int num[300];
int Hash[16000009];//hash函数
int main()
{
int n,nc;
string str;
while(~scanf("%d%d",&n,&nc))
{
memset(Hash,0,sizeof(Hash));
cin>>str;
int len=str.length();
int cnt=1;
num[str[0]]=0;
for(int i=1; i<len; i++) //将nc个字符转换为对应的nc进制的数,字母和数字是一一对应的
{
if(num[str[i]]==0)//只有当这个字符没有转换过的时候,才将该字符对应成一个数字
{
num[str[i]]=cnt;
cnt++;
}
}
int ans=0,sum;
for(int i=0; i<=len-n; i++)
{
sum=0;
for(int j=i; j<i+n; j++)
{
sum=sum*nc+num[str[j]];//特别要注意这里因为是nc进制的计算所以乘上的是nc,不要因为我们习惯的十进制计算而乘上10
}
//这样每一个长度为n的不同的子串都会唯一的对应一个数字
if(Hash[sum]==0)
{
Hash[sum]=1;
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}

POJ 1200 Crazy Search (哈希)的更多相关文章

  1. poj 1200 Crazy Search(hash)

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

  2. POJ 1200 Crazy Search(字符串简单的hash)

    题目:http://poj.org/problem?id=1200 最近看了一个关于hash的问题,不是很明白,于是乎就找了些关于这方面的题目,这道题是一道简单的hash 字符串题目,就先从他入手吧. ...

  3. POJ – 1200 Crazy Search

    http://poj.org/problem?id=1200 #include<iostream> #include<cstring> using namespace std; ...

  4. POJ 1200 Crazy Search 字符串的Hash查找

    第一次涉及HASH查找的知识 对于字符串的查找有很多前人开发出来的HASH函数,比较常用的好像是ELF 和 BKDR. 这道题没想到突破点是在于其nc值,告诉你组成字符串的字母种类. 还有用26进制, ...

  5. POJ 1200 Crazy Search

    思路:利用Karp-Rabin算法的思想,对每个子串进行Hash,如果Hash值相等则认为这两个子串是相同的(事实上还需要做进一步检查),Karp-Rabin算法的Hash函数有多种形式,但思想都是把 ...

  6. POJ 1200 Crazy Search 【hash】

    <题目链接> 题目大意: 给定n,nc,和一个字符串,该字符串由nc种字符组成,现在要你寻找该字符串中长度为n的子字符串有多少种. 解题分析: 因为要判重,所以讲这些字符串hash一下,将 ...

  7. POJ 1200 Crazy Search【Hash入门】

    RK法:https://www.cnblogs.com/16crow/p/6879988.html #include<cstdio> #include<string> #inc ...

  8. Crazy Search POJ - 1200 (字符串哈希hash)

    Many people like to solve hard puzzles some of which may lead them to madness. One such puzzle could ...

  9. poj 1200 crasy search

    https://vjudge.net/problem/POJ-1200 题意: 给出一个字符串,给出子串的长度n和给出的字符串中不同字符的个数nc,统计这个字符串一共有多少不同的长度为n的子串. 思路 ...

随机推荐

  1. html 文档类型

    <!doctype>用来声明html的版本,浏览器只有知道html的版本后才能正确显示文档,<!DOCTYPE>本身不是一个标签,而是一个声明.

  2. CSS实现水平居中的5种思路

    前面的话 水平居中是经常遇到的问题.看似方法较多,条条大路通罗马.但系统梳理下,其实都围绕着几个思路展开.本文将介绍关于水平居中的5种思路 text-align [思路一]:在父元素中设置text-a ...

  3. double转换为二进制

    arctan 在verilog 里是1qn或2qn格式,所以要把浮点数转换成1qn格式 1.dec2bin(十进制整数变为二进制) Convert decimal to binary number i ...

  4. Code First 重复外键

    原因:在一个表中,我有如下字段 表名:orderInfo 列名:companySend,companyReceiver 先展示表结构,(手打了,见谅) public class OrderInfo { ...

  5. Android 判断是否有声音在播放

    在Android中,我们可以通过AudioManager来判断是否有声音在播放. 实例1: 源码地址: PhoneWindowManager.java (frameworks\base\policy\ ...

  6. 逆向---02.je & jmp & jnz 、OD调试

    上一篇:逆向---01.Nop.中文字符串搜索.保存修改后程序 OD调试基础:(01.02篇练手工具:https://pan.baidu.com/s/1kW2qlCz) nop是删除跳转,你别问我,我 ...

  7. 离线安装.NET 3.5

    最近为系统新增一个功能,写完以后进行部署,发现在IIS7上部署没有问题,但是IIS6上部署会出现未知情况,具体表现为取不到数据,估计是IIS6和IIS7直接的差异导致程序异常退出. 为了重现异常,在本 ...

  8. jar包注册为Linux服务

    如果是SpringBoot项目,则需修改配置pom.xml为: <build> <plugins> <plugin> <groupId>org.spri ...

  9. 查询字符串(性能对比): Array Vs HashMap

    ip字符串长度: 15 ip count: 25 time - array:16ms, 查询次数:25000time - map:15ms, 查询次数:25000 ip count: 42 time ...

  10. 02-HTML5新的input属性

    本节重点 HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证 本节介绍新的输入类型: date datetime datetime-local email month numb ...