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 ...
随机推荐
- mysql5.7用户密码策略问题
密码策略问题 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 查看 mysql 初 ...
- Razor语法(一)
语法名称 Razor 语法 Web Forms 等效语法 代码块 @{ int x = 123; string y ="because."; } <% int x = ...
- 【转】Android一些知识点汇总
Android常用知识点总汇 一.系统上安装了多种浏览器,能否指定某浏览器访问指定页面?请说明原由. 如果在你的android系统上安装了多种浏览器,能否指定某浏览器访问指定页面?答案当然是:肯定的. ...
- Discuz常见小问题2-如何在新建的页面上只显示一部分板块
切换到论坛-版块管理,记住要只显示的板块的gid(比如我的是36) 为某个主导航设置一个单独的php页面(名字自己取) 如果这个页面内容跟首页forum.php完全一样,只是第三行增加了一句话 ...
- static 关键字 静态属性与方法 -> :: self $this 区别 可见性的关键字区别
1.声明类属性或方法为静态,就可以不实例化类而直接访问.静态属性不能通过一个类已实例化的对象来访问(但静态方法可以). 2.由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可 ...
- javascript脚本中使用json2.js解析json
官方地址:https://github.com/douglascrockford/JSON-js 点击页面右下角“Download ZIP”下载 网页中引用json2.js,下面是一个简单的例 ...
- 解决Android NDK 报jxxx编译找不到
如题 解决: 引入NDK对应的arm或者x86库 如果你用的是GinyMotion模拟器,那就引入x86库 不多说了,见截图 1.选择Propertities->C/C++ General-&g ...
- ffplay的快捷键以及选项 FFmpeg 基本用法 FFmpeg常用基本命令 ffmpeg常用转换命令,支持WAV转AMR
ffmpeg -i 32_mkv_h264_718x480_ac3.mkv -codec copy -bsf:v h264_mp4toannexb -f mpegts xx.ts ./ffmpeg ...
- 苹果推送服务器端证书配置.pem生成
做苹果推送服务器,很重要的一步,就是生成与苹果APNS连接的证书,一般是.pem文件: 首先在苹果开发者中心 生成 aps_devlopment.cer文件:然后下载:双击导入钥匙串: 打开钥匙串 - ...
- windows下流媒体nginx-rmtp-module服务器搭建及java程序调用fmpeg将rtsp转rtmp直播流【转】
https://github.com/illuspas/nginx-rtmp-win32 http://bashell.sinaapp.com/archives/build-nginx-rtmp-mo ...