UVALive 7712 Confusing Manuscript 字典树 查询与s的编辑距离为1的字符串数量
/**
题目:UVALive 7712 Confusing Manuscript
链接:https://vjudge.net/problem/UVALive-7712
题意:给定n个不同的字符串,f(i)表示第i个字符串和其他字符串的编辑距离为1的个数。
编辑距离为1表示两个字符串其中一个可以通过删除任意位置某一个字符或者增加任意位置某一个字符或者替换任意位置某一个字符之后,两者匹配。
输出f(i)最大的字符串,如果f(i)==f(j) (i<j) 输出第i个字符串。
思路:字典树
主要是处理细节。首先插入所有字符串。
然后枚举处理每个字符串s,对当前s,先从字典树删除它,然后query,最后插回字典树。 主要是query细节,以下都是对当前s进行处理:
int query(int u,char *s,int pos,int mofa) ; mofa表示当前是否进行以下三种操作任意一种。 1,add
可以直接和当前字典树的某个匹配,自身pos不加。
特殊情况:如果s[pos]=='\0';那么直接找字典树当前位置上存在的叶子节点。
2,cut
字典树当前位置不变,s的pos+1;
特殊情况:s[pos+1]=='\0';那么删除当前就没有了,所以计算结果为pos-1那一层的叶子节点。
实际上就是当前的u,判断val[u]就可以知道是否是叶子节点。
3,replace
直接替换。 */ #include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<cstring>
#include<cmath>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int maxnode = *+;///最多可能有多少个节点
const int maxn = 5e4+;
const int sigma_size = ;///0或者1
int ch[maxnode][sigma_size];///由于很大,所以结构体内部放不下。要放在外面。
char s[maxn][];
int ans = ;
int anspos;
struct Trie{
int val[maxnode];
int sz;
int idx(char c){return c-'a';} void insert(char *s)
{
int u = , c;
for(int i = ; s[i]!='\0'; i++){
c = idx(s[i]);
if(!ch[u][c]){
memset(ch[sz], , sizeof ch[sz]);
ch[u][c] = sz;
val[sz++] = ;
}
u = ch[u][c];
}
val[u]=;///表示该节点存在该单词。
}
void del(char *s)
{
int u = , c;
for(int i = ; s[i]!='\0'; i++){
c = idx(s[i]);
u = ch[u][c];
}
val[u]=;
} int query(int u,char *s,int pos,int mofa)
{
int c = idx(s[pos]);;
int cnt = ;
if(mofa==){
if(ch[u][c]==) return ;
if(s[pos+]=='\0'){
return val[ch[u][c]];
}else
{
return query(ch[u][c],s,pos+,);
}
}else
{
///add
if(s[pos]=='\0'){
for(int i = ; i < ; i++){
if(ch[u][i]) cnt += val[ch[u][i]];
}
return cnt;///不可以再进行删除和替换操作了。
}else{
for(int i = ; i < ; i++){
if(ch[u][i]==) continue;
cnt += query(ch[u][i],s,pos,);
}
} ///cut
if(s[pos+]=='\0'){
cnt += val[u];
}else
cnt += query(u,s,pos+,); ///replace for(int i = ; i < ; i++){
if(ch[u][i]==) continue;
if(i!=c){
if(s[pos+]=='\0'){
cnt += val[ch[u][i]];
}else
cnt += query(ch[u][i],s,pos+,);
}
} ///bu bian
if(ch[u][c]){
cnt += query(ch[u][c],s,pos+,);
} return cnt;
}
}
};
int main()
{
int T, n;
Trie trie;
int cas = ;
cin>>T;
while(T--)
{
scanf("%d",&n);
trie.sz = ;
memset(ch[], , sizeof ch[]);
for(int i = ; i < n; i++){
scanf("%s",s[i]);
trie.insert(s[i]);
}
ans = , anspos = ;//!
for(int i = ; i < n; i++){
trie.del(s[i]);
int temp = trie.query(,s[i],,);
//cout<<s[i]<<endl;
//cout<<temp<<endl;
if(temp>ans){
ans = temp; anspos = i;
}
trie.insert(s[i]);
}
printf("Case #%d: %s\n",cas++,s[anspos]);
}
return ;
}
UVALive 7712 Confusing Manuscript 字典树 查询与s的编辑距离为1的字符串数量的更多相关文章
- CodeForces 706D Vasiliy's Multiset (字典树查询+贪心)
题意:最开始的时候有一个集合,集合里面只有一个元素0,现在有q次操作,操作分为3种: + x: 表示向集合中添加一个元素x - x:表示删除集合中值为x的一个元素 ? x:表示查询集合中与x异或的最大 ...
- UVALive 5029 字典树
E - Encoded Barcodes Crawling in process...Crawling failedTime Limit:3000MS Memory Limit:0KB 6 ...
- poj 3764 The xor-longest Path(字典树)
题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值.找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每一个节点到根 ...
- 字典树(前缀树)-Java实现
字典树 字典树是一种树形结构,优点是利用字符串的公共前缀来节约存储空间.在这提供一个自己写的Java实现,非常简洁. 根节点没有字符路径.除根节点外,每一个节点都被一个字符路径找到. 从根节点到某一节 ...
- 字符串hash与字典树
title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是 ...
- 数据结构&字符串:01字典树
利用01字典树查询最大异或值 01字典树的是只含有0和1两种字符的字典树,在使用它的时候,把若干数字转成二进制后插入其中 在查询树中的哪个数字和给定数字有最大异或值的时候,从根开始贪心查询就ok了 H ...
- Trie|如何用字典树实现搜索引擎的关键词提示功能
Trie字典树 Trie字典树又称前缀树,顾名思义,是查询前缀匹配的一种树形数据结构 可以分为插入(创建) 和 查询两部分.参考地址极客时间 下图为插入字符串的过程: 创建完成后,每个字符串最后一个字 ...
- hust 1605 - Gene recombination(bfs+字典树)
1605 - Gene recombination Time Limit: 2s Memory Limit: 64MB Submissions: 264 Solved: 46 DESCRIPTION ...
- 字典树模板( 指针版 && 数组版 )
模板 : #include<string.h> #include<stdio.h> #include<malloc.h> #include<iostream ...
随机推荐
- 【android开发】10款实用的Android UI工具,非常有用!
移动应用的UI设计就好似达摩克利斯之剑,一方面,一个视觉.交互.体验良好的UI可以加强应用在用户心目中的形象和识别性.而另一方面,一个体验糟糕的UI设计不仅无法让用户沉浸在应用中,还会造成用户对应用产 ...
- HTTP状态码及说明
- [ES6] 10. Array Comprehensions
ES6 decided that Array Comprehensions will not included in this version, ES7 will include this. Ther ...
- Python函数:使用谷歌翻译翻译英语字符串
代码是同事写的,我把它单独抠出来,可以作为工具函数使用.当然,性能还是个问题,有待解决. import random import cookielib import urllib import url ...
- Qracle、Sql server 、mysql查询练习题
1. select * from emp; 2. select empno, ename, job from emp; 3. select empno 编号, ename 姓名, job 工作 fro ...
- Android中的线程池概述
线程池 Android里面,耗时的网络操作,都会开子线程,在程序里面直接开过多的线程会消耗过多的资源,在众多的开源框架中也总能看到线程池的踪影,所以线程池是必须要会把握的一个知识点; 线程运行机制 开 ...
- Unity3d 录像
flashtd1: 回复 tqfa :我觉得是有方法可以实现的,之前使用高通的增强显示开发包时发现其实它是添加了一个类似movietexture的东西,叠加在它的摄像机上 如果文档里有操作moviet ...
- django2自动发现项目中的url
根据路飞学城luffycity.com 的crm项目修改的 1 url入口:rbac/urls.py urlpatterns = [ ... # 批量操作权限 re_path(r'^multi/per ...
- js 常用类型转换简写
1.字符串转数字 +'666' 2.转换为字符串 ''+666 //'666'
- bootstrap 页面标题
页面标题会突出显示,当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题显得特别有用,页面标题会给不是页面标题之间的元素加上横线 加以区分,以突出标题显示. 页面标题类 显示效果图 代码 ...