http://www.itint5.com/oj/#15

用hash来做,目前为止做到最好也是case16超时(20w的规模),即使分桶也超时。注意计算hashcode时,'a'要算成1,否则如果'a'为0,那么"aa"和"a"是一样的。下面是超时的代码:

#define BUCKET 65535
#define ulong long long vector<unordered_set<ulong> > uset(BUCKET);
vector<ulong> pow26(11); ulong hashcode(char *str, int n) {
ulong code = 0;
for (int i = 0; i < n; i++) {
code = code * 26 + str[i] - 'a' + 1;
}
return code;
} // 预处理初始化
void initWithString(char *str) {
int len = 0;
while (str[len] != '\0') {
len++;
}
ulong num = 1;
pow26[0] = 1;
for (int i = 1; i <= 10; i++) {
num *= 26;
pow26[i] = num;
}
for (int l = 1; l <= 10; l++) {
vector<ulong> codes(len);
for (int i = 0; i < len; i++) {
if (i + l <= len) {
ulong code = 0l;
if (i == 0) {
code = hashcode(str+i, l);
codes[i] = code;
} else {
ulong diff = pow26[l-1];
diff *= (str[i-1] - 'a' + 1);
code = (codes[i-1] - diff) * 26 + str[i+l-1] - 'a' + 1;
codes[i] = code;
} int buck = code % BUCKET;
uset[buck].insert(code);
}
}
}
}
// 如果query是str的字串,返回true,否则返回false
bool existSubString(char *query) {
int len = strlen(query);
ulong code = hashcode(query, len);
int buck = code % BUCKET;
if (uset[buck].find(code) != uset[buck].end()) {
return true;
} else {
return false;
}
}

如果只存长度为10的字符串到排序好的vector里,然后用二分来做,是能过的。注意有的源字符串长度就小于10了。其他的备选方法还有trie以及后缀数组。

vector<string> vec;

// 预处理初始化
void initWithString(char *str) {
set<string> sset;
int len = strlen(str);
for (int i = 0; i < len; i++) {
if (i + 10 >= len) {
string sub(str+i);
sset.insert(sub);
} else {
string sub(str+i, str+i+10);
sset.insert(sub);
}
} for (set<string>::iterator it = sset.begin(); it != sset.end(); it++) {
vec.push_back(*it);
}
}
// 如果query是str的字串,返回true,否则返回false
bool existSubString(char *query) {
string str(query);
int low = 0;
int high = vec.size()-1; while (low <= high) {
int mid = (low + high) / 2;
bool found = true;
for (int i = 0; i < str.length(); i++) {
if (vec[mid][i] < str[i]) {
low = mid + 1;
found = false;
break;
} else if (vec[mid][i] > str[i]) {
high = mid - 1;
found = false;
break;
}
}
if (found) return true;
}
return false;
}

  

[itint5]字符串匹配的更多相关文章

  1. 字符串匹配的KMP算法

    ~~~摘录 来源:阮一峰~~~ 字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”? 许 ...

  2. {Reship}{KMP字符串匹配}

    关于KMP字符串匹配的介绍和归纳,作者的思路非常清晰,推荐看一下 http://blog.csdn.net/v_july_v/article/details/7041827

  3. 字符串匹配(hash算法)

    hash函数对大家来说不陌生吧 ? 而这次我们就用hash函数来实现字符串匹配. 首先我们会想一下二进制数. 对于任意一个二进制数,我们将它化为10进制的数的方法如下(以二进制数1101101为例): ...

  4. 【C++实现python字符串函数库】二:字符串匹配函数startswith与endswith

    [C++实现python字符串函数库]字符串匹配函数startswith与endswith 这两个函数用于匹配字符串的开头或末尾,判断是否包含另一个字符串,它们返回bool值.startswith() ...

  5. sdut 2125串结构练习--字符串匹配【两种KMP算法】

    串结构练习——字符串匹配 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目链接:http://acm.sdut.edu.cn/sduto ...

  6. C语言字符串匹配函数

    C语言字符串匹配函数,保存有需要时可以用: #include <stdio.h> #include <stdlib.h> #include <string.h> # ...

  7. 字符串匹配--Karp-Rabin算法

    主要特征 1.使用hash函数 2.预处理阶段时间复杂度O(m),常量空间 3.查找阶段时间复杂度O(mn) 4.期望运行时间:O(n+m) 本文地址:http://www.cnblogs.com/a ...

  8. 字符串匹配的KMP算法详解及C#实现

    字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...

  9. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

随机推荐

  1. DOM_节点层次

    一.DOM1级定义了一个Node接口,这个接口是由DOM中的所有节点类型实现的.Node接口共有12种节点类型,常见的是元素节点.文本节点和文档节点. Node.ELEMENT_NODE(1);——元 ...

  2. C++ typedef用法小结

    一.typedef的四个用法 用法一: 为复杂的声明定义一个新的简单的别名.方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版.举例 ...

  3. HTML5之 WebSockets

    ------- 新的网络连接技术 - Web-Sockets 持续连接数据流 全双工工作方式 http补充品而非替代品 - 应用场景 聊天室 股票显示 在线游戏(尤为突出) - 2byte的通信 1b ...

  4. 关于linux下零散的东西 --慢慢补充

    一.截图     ,使用Shift+Ctrl+PrtSc就可以截图. 二.tar命令参数 c:表示压缩 x:表示解压 z:表示gzip的方式解/压缩 j:表示bzip2的方式解/压缩 三.串口终端ke ...

  5. spring 计划任务:cron表达式

    Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 格式: Seconds Minutes Hours DayofMonth Mont ...

  6. 生成静态页面的PHP类

    生成静态页面的PHP类: 复制代码代码如下: <?php   class html   {    var $dir; //dir for the htmls(without/)    var $ ...

  7. laravel扩展Debugbar

    github地址:https://github.com/barryvdh/laravel-debugbar

  8. (转载)Cocos2dx-OpenGL ES2.0教程:初识MVP(3)

    在上一篇文章中,我在介绍vertex shader的时候挖了一个坑:CC_MVPMatrix.它其实是一个uniform,每一个cocos2d-x预定义的shader都包含有这个uniform, 但是 ...

  9. 【BZOJ 1070】[SCOI2007]修车

    Description 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使 ...

  10. Weblogic12c安装与配置详解

    Weblogic是什么Weblogic的安装Weblogic创建域Weblogic管理域Weblogic的应用Weblogic是什么 Weblogic这是我入职以后第一次接触到的词汇,我很陌生,就从我 ...