SPOJ Hacking(字典树 + 搜索)题解
思路1:字典树存每个串,然后dfs遍历是否存在。这里有个技巧,如果每次都重新初始化字典树为-1,那么会超时,所以我先初始化为-1,然后设一个Case,每个test时Case都++,那么只要开一个数组判断是否等于Case,如果等于就说明有这条路,不等则没有。这道题用字典树做要注意剪枝。
思路2:这道题能随机看命过
代码1:
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<iostream>
#include<algorithm>
typedef long long ll;
const int maxn = 1e4 + ;
const int seed = ;
const ll MOD = 1e9 + ;
const int INF = 0x3f3f3f3f;
using namespace std;
int n, m, k, length, Case;
char s[maxn], ans[];
int trie[maxn * ][], cs[maxn * ][], tot;
void update(int st){
int p = ;
for(int i = ; i < m; i++){
if(st + i > n) return;
int v = s[st + i] - 'a';
if(v >= k) return; //剪枝
if(cs[p][v] != Case){
trie[p][v] = ++tot;
cs[p][v] = Case;
}
p = trie[p][v];
}
}
bool dfs(int p, int len){
if(len > m) return false;
for(int i = ; i < k; i++){
if(cs[p][i] != Case){
ans[length++] = 'a' + i;
return true;
}
else if(dfs(trie[p][i], len + )){
ans[length++] = 'a' + i;
return true;
}
}
return false;
}
int main(){
int t;
Case = ;
memset(cs, -, sizeof(cs));
scanf("%d", &t);
while(t--){
Case++;
tot = ;
scanf("%d%d%d", &n ,&m, &k);
scanf("%s", s + );
for(int i = ; i <= n; i++){
update(i);
}
length = ;
dfs(, );
for(int i = length - ; i >= ; i--)
printf("%c", ans[i]);
printf("\n");
}
return ;
}
代码2:
#include<queue>
#include<cstring>
#include<set>
#include<map>
#include<stack>
#include<string>
#include<cmath>
#include<vector>
#include<cstdio>
#include<iostream>
#include<algorithm>
typedef long long ll;
const int maxn = 1e4 + ;
const int seed = ;
const ll MOD = 1e9 + ;
const int INF = 0x3f3f3f3f;
using namespace std;
int n, m, k;
char s[maxn];
int main(){
int t;
srand(time(NULL));
scanf("%d", &t);
while(t--){
map<string, int> st;
scanf("%d%d%d", &n ,&m, &k);
scanf("%s", s + );
for(int i = ; i <= n - m + ; i++){
string ss;
for(int j = i; j < i + m; j++){
ss += s[j];
}
st[ss] = ;
}
string ans;
while(true){
ans = "";
for(int i = ; i < m; i++){
ans += 'a' + rand() % k;
}
if(st[ans] == ){
cout << ans << endl;
break;
}
}
}
return ;
}
SPOJ Hacking(字典树 + 搜索)题解的更多相关文章
- newcoder 筱玛的迷阵探险(搜索 + 01字典树)题解
题目描述 筱玛是个快乐的男孩子. 寒假终于到了,筱玛决定请他的朋友们一起来玩迷阵探险. 迷阵可以看做一个n×nn×n的矩阵A,每个格子上有一个有一个数Ai,j. 入口在左上角的(1,1)处,出口在右下 ...
- FJUT seventh的tired树上路径(01字典树)题解
思路(来自题解): 众所周知树上两个点xy的距离是deep[x]+deep[y]-deep[lca(x,y)]*2 然后我们把这个加减法换成异或,我们就会发现,deep[lca(x,y)]被消掉了 所 ...
- HDU 4825 Xor Sum(01字典树)题解
思路:先把所有数字存进字典树,然后从最高位贪心. 代码: #include<set> #include<map> #include<stack> #include& ...
- HDU 1247 Hat’s Words(字典树)题解
题意:给一个字符串集,要你给出n个字符串s,使s能被所给字符串集中的两个相加所得(ahat=a+hat) 思路:简单字典树题,注意查询的时候要判断所指next是否为NULL,否则会RE非法访问. 代价 ...
- Trie树(字典树)-题解 P2580 【于是他错误的点名开始了】
此题可以用STL中的map做,但是了解一下Trie树这个数据结构也是必须的. Trie树(又称字典树)有以下特点: 根节点不包含字符,除它之外的每一个节点都包含一个字符. 从根节点到某一节点,路径上经 ...
- E - Petya and Exam CodeForces - 832B 字典树+搜索
E - Petya and Exam CodeForces - 832B 这个题目其实可以不用字典树写,但是因为之前写过poj的一个题目,意思和这个差不多,所以就用字典树写了一遍. 代码还是很好理解的 ...
- hdu 1671 Phone List(字典树)题解
题意:给一连串数字,如果有前缀重复给出NO,否则给出YES 思路:这道题要delete否则爆内存,之前想的直接在insert()里解决查询有错误,所以先保存数据再查询. 代码: #include< ...
- hdu1247-Hat’s Words-(字典树)
http://acm.hdu.edu.cn/showproblem.php?pid=1247 题意:给出一堆单词,求哪些单词是其中某两个单词拼接起来的. 题解:用字典树存储所有的单词,标记结束点,再次 ...
- Trie树(字典树) 最热门的前N个搜索关键词
方法介绍 1.1.什么是Trie树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优 ...
随机推荐
- 算法抽象及用Python实现具体算法
一.算法抽象 它们一般是在具体算法的基础上总结.提炼.分析出来的,再反过来用于指导解决其它问题.它们适用于某一类问题的解决,用辩 证法的观点看,抽象的算法和具体的算法就是抽象与具体.普遍性与特殊性.共 ...
- 纯css打造凹进与突出效果
1.凹进效果 background:#f2f2f2 center repeat; border-bottom: 1px solid #e9e9e9;border-top: 1px solid # ...
- How many Fibs?(poj 2413)大数斐波那契
http://acm.sdut.edu.cn:8080/vjudge/contest/view.action?cid=259#problem/C Description Recall the defi ...
- Mybatis的多对多映射
一.Mybatis的多对多映射 本例讲述使用mybatis开发过程中常见的多对多映射查询案例.只抽取关键代码和mapper文件中的关键sql和配置,详细的工程搭建和Mybatis详细的流程代码可参见& ...
- 【weka】分类,cross-validation,数据
一.分类classifier 如何利用weka里的类对数据集进行分类,要对数据集进行分类,第一步要指定数据集中哪一列做为类别,如果这一步忘记了(事实上经常会忘记)会出现“Class index is ...
- 机器学习理论基础学习15---条件随机场(CRF)
一.CRF的由来HMM->MEMM->CRF 二.HMM到MEMM MEMM打破了HMM的观测条件独立假设 三.MEMM到CRF CRF克服了MEMM的label bias problem ...
- php array_rand()函数从数组中随机选择一个或多个元素
php使用array_rand()函数从数组中随机选择一个或多个元素的方法. 使用array_rand() 函数从数组中随机选出一个或多个元素,并返回. array_rand(array,numbe ...
- Leetcode: Reorder List && Summary: Reverse a LinkedList
Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do th ...
- Trove系列(三)—Trove的功能管理功能介绍
Trove的功能管理功能Trove的功能管理功能包括给各种不同的版本的 datastore 安装不同的 功能. 本管理功能只适用于激活/去活全系统的功能.唯一例外的是数据存储功能列表功能,该功能对所有 ...
- 支持向量机(SVM)中的 SMO算法
1. 前言 最近又重新复习了一遍支持向量机(SVM).其实个人感觉SVM整体可以分成三个部分: 1. SVM理论本身:包括最大间隔超平面(Maximum Margin Classifier),拉格朗日 ...