题目链接

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. Cuba获取属性文件中的配置

    最直接的办法是,使用AppContext.getProperty("cuba.trustedClientPassword"); 可以获取到系统中的web模块下的wep-app.pr ...

  2. Python网络爬虫:空姐网、糗百、xxx结果图与源码

    如前面所述,我们上手写了空姐网爬虫,糗百爬虫,先放一下传送门: Python网络爬虫requests.bs4爬取空姐网图片Python爬虫框架Scrapy之爬取糗事百科大量段子数据Python爬虫框架 ...

  3. 自学Zabbix2.2-服务器端环境配置

    点击返回:自学Zabbix之路

  4. emwin 之消息 WM_INIT_DIALOG

    @2018-08-09 小记 消息 WM_INIT_DIALOG 在创建窗口时首先发送且只在创建窗口时发送即只发送这一次

  5. rsync同步官方zabbix仓库搭建本地yum源

    1.同步资源 # rsync -vrt rsync://repo.zabbix.com/mirror/zabbix/3.4/rhel/7/x86_64/ /home/mirrors/zabbix/3. ...

  6. 搭建gulp脚手架

    前段时间刚好在开发公司的首页,使用的是gulp工作流,gulp相对于webpack而言,配置简单,也更加直观(很符合直觉),日常开发一些静态页面.html5专题也足够,这里把遇到的坑与实践经验记录一下 ...

  7. A1055. The World's Richest

    Forbes magazine publishes every year its list of billionaires based on the annual ranking of the wor ...

  8. 开启 Hyper-v 后如何使用 Android Emulator?

    如果开启了 Hyper-v 时,当需要使用 Android Studio 中 Android Emulator 时,系统会出现蓝屏代码错误. 使用下面的方法,则可以解决冲突. 首先,你需要确保已经开启 ...

  9. QtCreator添加第三方头文件和类库

    在Qt Creator的项目中添加头文件和库 在Qt Creator中的工程中,工程通过.pro文件管理. 额外需要连接的连接库 unix:LIBS += -L your_lib_path -lyou ...

  10. shell命令批量创建指定格式的文件

    shell命令批量创建文件 [root@w212 test]# for count in `seq 9` ;do echo "$count" > a.2018050$coun ...