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. OC2_ARC MRC混合编程

    // // main.m // OC2_ARC MRC混合编程 // // Created by zhangxueming on 15/6/19. // Copyright (c) 2015年 zha ...

  2. out ref区别

    1.使用ref型参数时,传入的参数必须先被初始化.对out而言,必须在方法中对其完成初始化. 2.out适合用在需要retrun多个返回值的地方,而ref则用在需要被调用的方法修改调用者的引用的时候. ...

  3. requirejs实验001.对我来说,用AMD的方式来组织代码并不轻松.

    http://www.requirejs.org/ http://www.requirejs.cn/ http://requirejs.readthedocs.org/en/1.0.1/ 目录结构: ...

  4. template_11实参演绎

    1,演绎过程匹配类型A(来自实参的类型),参数化类型P(行参参数声明)如果被声明的参数是一个引用声明g(T& )那么P就是所引用类型T:f(T)中P就是所声明的参数类: decay指从数组和函 ...

  5. SQL Server 收缩事务日志的方法

    由于SQL2008对文件和日志管理进行了优化,所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消:(SQL2005) Backup Log DataBaseName with no_ ...

  6. Android SDK Manager国内无法更新的解决方案

    万里长城永不倒,千里黄河水滔滔.算了跑题了. 但还是要吐槽这下这个万里长城,感谢 方滨兴 叫兽 给我们净化了互联网,靠!什么&!@#¥ 此处略去一万字. 现在由于GWF,google基本和咱们 ...

  7. 数据库(MSSQLServer,Oracle,DB2,MySql)常见语句以及问题

    创建数据库表 create table person ( FName varchar(), FAge int, FRemark varchar(), primary key(FName) ) 基本sq ...

  8. [DevExpress][TreeList]条件隐藏节点CheckBox

    关键代码: /// <summary> /// 隐藏CheckBox /// 说明 /// 在CustomDrawNodeCheckBox事件中使用 /// eg: /// TreeLis ...

  9. shopnc 商城源码阅读笔记--开篇概述

    关于shopnc 以下是摘抄自百度百科的关于shopnc的介绍: ShopNC商城系统,是天津市网城天创科技有限责任公司开发的一套多店模式的商城系统. 本系统具有商城系统非常完整和专业的功能与流程,系 ...

  10. cxgrid GridMode 等于 True 时的一些问题。

    When using grid mode, the data controller loads a fixed number of dataset records into memory. The n ...