题意

给定一个由NC个字母组成的字符串,求长度为N的不同子串的个数

思路:

由于只有NC个字母,可以将字母编号,0 ~ NC - 1,转换成数字,就可以将字符串表示成NC进制的数字,这样所有字串代表的数字都是唯一的,转换成10进制的数也是唯一的!

就像10的二进制表示只有1010

例如

3 4
daababac
d = 3
a = 0
b = 1
c = 2
daa = 3 * 4 ^ 2 + 0 * 4 ^ 1 + 0 * 4 ^ 0 = 48
//vs1.0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 16000000char str[MAX];
bool hash[MAX];
int ancii[128];int main() {int N, NC;while (scanf("%d%d%s", &N, &NC, str) != EOF) {memset(hash, true, sizeof(hash));memset(ancii, 0, sizeof(ancii));int cnt = 0;for (char *s=str; *s; ++s) {if (!ancii[*s]) {ancii[*s] = ++cnt;if (NC == cnt) break;}}int sum;int ans = 0;int len = strlen(str) - N + 1;for (int i=0; i<len; ++i) {sum = 0;for (int j=0; j<N; ++j) sum = sum * NC + (ancii[str[i+j]] - 1);if (hash[sum]) {++ans;hash[sum] = false;}}printf ("%d\n", ans);}return 0;
}//vs2.0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 16000000char str[MAX];
bool hash[MAX];
int ancii[128];int main() {int N, NC;while (scanf("%d%d%s", &N, &NC, str) != EOF) {memset(hash, true, sizeof(hash));memset(ancii, 0, sizeof(ancii));int cnt = 0;for (char *s=str; *s; ++s) {if (!ancii[*s]) {ancii[*s] = ++cnt;if (NC == cnt) break;}}int sum = 0;int tmp = 1;for (int i=0; i<N; ++i) {tmp *= NC;sum = sum * NC + ancii[str[i]] - 1; }tmp /= NC;hash[sum] = false;int ans = 1;int len = strlen(str);for (int i=N; i<len; ++i) {sum = (sum - tmp * (ancii[str[i-N]]-1)) * NC + ancii[str[i]] - 1;if (hash[sum]) {++ans;hash[sum] = false;}}printf ("%d\n", ans);}return 0;
}

转载于:https://www.cnblogs.com/try86/archive/2012/07/24/2605851.html

POJ 1200 Crazy Search(RK)相关推荐

  1. poj 1200 Crazy Search

    http://poj.org/problem?id=1200 字符串搜索,要将字符串之前搜索过的字符串用一个数来映射储存.这里的字符串长达16*10^6,所以不能hash储存,就连下标都不能存下来,所 ...

  2. POJ 1200 Crazy Search 查找有多少种不同的子串(hash)

    文章目录 1.采用map解题 2.采用hash查找 题目链接: http://poj.org/problem?id=1200 题目大意:给定子串长度,字符中不同字符数量,以及一个字符串,求不同的子串数 ...

  3. 【POJ 1200】Crazy Search(将字符映射为数字,将NC进制hash成10进制)

    题目链接 题目链接 http://poj.org/problem?id=1200 题意 原字符串有NC个不同字母,统计原字符串长度为N的子字符串个数 解题思路 将字符按ASCII码映射成数字. 将n个 ...

  4. poj 3378 Crazy Thairs

    题意/Description:     These days, Sempr is crazed on one problem named Crazy Thair. Given N (1 ≤ N ≤ 5 ...

  5. poj1200 Crazy Search(hash)

    题目大意就是将一个字符串分成长度为N的字串.且不同的字符不会超过NC个.问总共有多少个不同的子串. 采用的办法就是以nc作为进制,把一个子串化为这个进制下的数,再用哈希判断.由于题目说长度不会超过16 ...

  6. POJ_1200 Crazy Search ( Hash映射 )

    题目连接 题意 给一个含有nc个不同字母的字符串,然后求其中有多少个长度为n的不同子串. 题解 因为题目中给出了nc,即字母种类的个数.所以可以把每一个出现的字母对应为1到nc.然后把长度为n的字符串 ...

  7. POJ题目分类(按初级\中级\高级等分类,有助于大家根据个人情况学习)

    本文来自:http://www.cppblog.com/snowshine09/archive/2011/08/02/152272.spx 多版本的POJ分类 流传最广的一种分类: 初期: 一.基本算 ...

  8. Linux里怎么进行路由跟踪,[Linux] traceroute 路由跟踪指令用例

    traceroute是用来跟踪数据包到达网络主机所经过的路由工具.在Linux系统中,称之为traceroute,在Windows中称为tracert. 一条路径上的每个设备traceroute要测3 ...

  9. 本周题解(9.12)

    例题 POJ 1200 Crazy Search 解题思路: 将N个字符串分别转换成数字 然后按照 NC进制转换为 10进制 然后开一个标记数组进行标记(判定唯一性) 这样大大缩短了 时间 1600万 ...

最新文章

  1. 计算机桌面分页,电脑word文档怎么快速分页?
  2. Linus怒批GitHub:制造了毫无用处的垃圾合并信息!
  3. [architecture]-Armv8 Cryptographic Extension介绍
  4. 删除文件后,磁盘空间没有释放的处理记录
  5. 【plupload】单易用且功能强大的上传组件
  6. sentinel里的双检锁
  7. jqueryGannt用法
  8. qt解析html的数据,windows下用QTwebkit解析html
  9. 家谱(信息学奥赛一本通-T1388)
  10. 相量除法能用计算机吗,电路相量的加减乘除运算
  11. 简单的故事品味生活,
  12. python接口自动化(四十一)- 发xml格式参数的post请求(超详解)
  13. 怎么把图片上的字去掉_视频片头怎么减掉,电脑如何剪切掉视频的开头「视频批量剪辑」...
  14. 概率论与数理统计 (二)填空题
  15. 根据百度的语音识别例子,展示C如何调用C++库
  16. Ubuntu 安装 中文输入法(Google 拼音)
  17. 数据通信技术初级工程师证题库
  18. word转03版本公式变成图片_word2013公式编辑器_Word 2013保存的时候突然发现公式变成图片怎么办?_word文档打字的时候...
  19. arugsJS 入门
  20. CryEngine 渲染流程

热门文章

  1. 1.3)深度学习笔记------浅层神经网络
  2. 机器学习笔记(十五):推荐系统
  3. 恐怖黎明稳定服务器,恐怖黎明新人联机图文教程 怎么联机-游侠网
  4. android吸附菜单,Android仿微博、人人Feed详情页吸附导航栏
  5. 盐务街属于一环吗_郑州步入“五环”时代,最早的“一环”原来是这里
  6. 遍历这些字符串,如果字符串没有包含数字的, * 就将字符串中的小写字母转成大写字母并打印字符串
  7. oracle临时表空间占用率过高,ORACLE 临时表空间使用率过高的原因及临时解决方案...
  8. iphone如何查看dns延迟_iPhone手机网速慢?1分钟教你设置DNS,网速立马翻一番
  9. 覆盖索引与联合索引_浅析MySQL的索引覆盖和索引下推
  10. UNIX(进程间通信):01---Linux进程通信方式