/**
题目: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的字符串数量的更多相关文章

  1. CodeForces 706D Vasiliy's Multiset (字典树查询+贪心)

    题意:最开始的时候有一个集合,集合里面只有一个元素0,现在有q次操作,操作分为3种: + x: 表示向集合中添加一个元素x - x:表示删除集合中值为x的一个元素 ? x:表示查询集合中与x异或的最大 ...

  2. UVALive 5029 字典树

    E - Encoded Barcodes Crawling in process...Crawling failedTime Limit:3000MS    Memory Limit:0KB    6 ...

  3. poj 3764 The xor-longest Path(字典树)

    题目链接:poj 3764 The xor-longest Path 题目大意:给定一棵树,每条边上有一个权值.找出一条路径,使得路径上权值的亦或和最大. 解题思路:dfs一遍,预处理出每一个节点到根 ...

  4. 字典树(前缀树)-Java实现

    字典树 字典树是一种树形结构,优点是利用字符串的公共前缀来节约存储空间.在这提供一个自己写的Java实现,非常简洁. 根节点没有字符路径.除根节点外,每一个节点都被一个字符路径找到. 从根节点到某一节 ...

  5. 字符串hash与字典树

    title: 字符串hash与字典树 date: 2018-08-01 22:05:29 tags: acm 算法 字符串 概述 这篇主要是关于字符串里的 字符串hash 和 字符串字典树,,两个都是 ...

  6. 数据结构&字符串:01字典树

    利用01字典树查询最大异或值 01字典树的是只含有0和1两种字符的字典树,在使用它的时候,把若干数字转成二进制后插入其中 在查询树中的哪个数字和给定数字有最大异或值的时候,从根开始贪心查询就ok了 H ...

  7. Trie|如何用字典树实现搜索引擎的关键词提示功能

    Trie字典树 Trie字典树又称前缀树,顾名思义,是查询前缀匹配的一种树形数据结构 可以分为插入(创建) 和 查询两部分.参考地址极客时间 下图为插入字符串的过程: 创建完成后,每个字符串最后一个字 ...

  8. hust 1605 - Gene recombination(bfs+字典树)

    1605 - Gene recombination Time Limit: 2s Memory Limit: 64MB Submissions: 264 Solved: 46 DESCRIPTION ...

  9. 字典树模板( 指针版 && 数组版 )

    模板 :  #include<string.h> #include<stdio.h> #include<malloc.h> #include<iostream ...

随机推荐

  1. Eclipse 构建Maven项目--普通web项目

    一.Maven项目的新建 1.鼠标右键---->New----->Maven Project 2.直接点下一步 3.选中 maven-archetype-webapp 后点击下一步 4. ...

  2. 隐藏系统EFI分区Z盘

    找到C:\Windows\System32\cmd.exe程序, 右键单击cmd 选择以管理员身份运行, 打开命令提示符,输入以下命令(不区分大小写)DiskPart回车List空格volume回车s ...

  3. git 批量删除文件夹和文件

    git 批量删除文件夹和文件 硬盘删除文件后,执行$ git status   会提示你仍然需要$ git rm <文件>   此时如果是要删除大批量文件,这么一个一个命令下去不得累死人啊 ...

  4. 图片转为byte[]、String、图片之间的转换

    package com.horizon.action; import java.io.ByteArrayOutputStream; import java.io.File; import java.i ...

  5. C#秘密武器之异步编程

    一.概述 1.什么是异步? 异步操作通常用于执行完成时间可能较长的任务,如打开大文件.连接远程计算机或查询数据库.异步操作在主应用程序线程以外的线程中执行.应用程序调用方法异步执行某个操作时,应用程序 ...

  6. js知识梳理2:对象属性的操作

    1.属性的查询和设置 ①基本语法 这个简单,可以通过点(.)或方括号([])运算来获取属性的值,注意点运算符后的标识符不能是保留字,方括号内的表达式必须返回字符串或返回一个可以转换成字符串的值. va ...

  7. android源代码分析 android toast使用具体解释 toast自己定义

    在安卓开发过程中.toast使我们常常使用的一个类.当我们须要向用户传达一些信息,可是不须要和用户交互时,该方式就是一种十分恰当的途径. 我们习惯了这样使用toast:Toast.makeText(C ...

  8. Debian9.3安装NW360无线网卡驱动

    最近想把家里的一台老旧台式机利用起来,打算安装Debian9.3,下载ISO,用PowerISO写入到U盘,然后开始安装,过程基本顺利. 就是中间提示缺少“rtl_nic/rtl8105e-1.fw” ...

  9. CentOS下febootstrap自制Docker的CentOS6.6和7.1 Docker镜像

    docker image centos febootstrap CentOS 6.6和7.1 Docker自制CentOS镜像 安装: ? 1 yum -y install febootstrap 添 ...

  10. Specification模式的一个不错的示例代码

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace Specifi ...