【题解】Fuzzy Google Suggest(UVA1462)
题意
给定一个字符串集合,有n次搜索,每次有一个整数x和一个字符串,表示可以对字符串进行x次修改,
包括增加、修改和删除一个字符,问修改后的字符串可能是字符集中多少个字符串的前缀。
思路
简单题。 主要是觉得模糊匹配挺有意思的,虽然跟Google没啥关系
首先对给出的字符串集建 Trie。对于每一次搜索操作,在 Trie 上进行两次 dfs(算上清理是3次,因为数据范围三百万不可能 memset ,代码中将计算贡献和清除一起写了)
第一次 dfs 对于搜索串进行处理,如果匹配那么直接搜索,否则减少一次剩余修改次数并继续搜索。这个过程中,为了计算贡献需要打 tag,如果是路径上经过的 Trie 节点就标记为1,如果是结尾就标记为2.
第二次 dfs 对tag数组清除,并累加第一次出现2的位置的贡献。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=3e6+10;
int n;
char str[21];
struct Trie
{
int siz,g[N][26],val[N],vis[N];
int dep,ans;
char s[21];
void init()
{
siz=1; val[0]=0; memset( g[0],0,sizeof(g[0]) );
}
void dfs( int p,int len,int x )
{
if ( x<0 ) return;
if ( vis[p]==0 ) vis[p]=1;
if( len==dep ) { vis[p]=2; return; }
int ch=s[len]-'a';
if ( g[p][ch] ) dfs( g[p][ch],len+1,x );
dfs( p,len+1,x-1 );
for ( int i=0; i<26; i++ )
if ( g[p][i] ) dfs( g[p][i],len,x-1 ),dfs( g[p][i],len+1,x-1 );
}
void clear( int p,int flag )
{
if ( vis[p]==0 ) return;
if ( flag && vis[p]==2 ) ans+=val[p],flag=0;
for ( int i=0; i<26; i++ )
if ( g[p][i] ) clear( g[p][i],flag );
vis[p]=0;
}
int calc( char *str,int x )
{
ans=0; dep=strlen(str); strcpy( s,str );
dfs( 0,0,x ); clear( 0,1 );
return ans;
}
void insert( char *str )
{
int p=0,n=strlen(str);
for ( int i=0; i<n; i++ )
{
int ch=str[i]-'a';
if ( g[p][ch]==0 )
{
val[siz]=0; memset( g[siz],0,sizeof(siz) );
g[p][ch]=siz++;
}
p=g[p][ch]; val[p]++;
}
}
}tr;
int main()
{
while ( scanf( "%d",&n )==1 )
{
tr.init();
for ( int i=0; i<n; i++ )
scanf( "%s",str ),tr.insert(str);
scanf( "%d",&n );
while ( n-- )
{
int x; scanf( "%s%d",str,&x );
printf( "%d\n",tr.calc(str,x) );
}
}
}
【题解】Fuzzy Google Suggest(UVA1462)的更多相关文章
- AJAX实现仿Google Suggest效果
修复了一些细节代码(支持持续按键事件) *项目名称:AJAX实现类Google Suggest效果*作者:草履虫(也就是蓝色的ecma)*联系:caolvchong@gmail.com*时间:2007 ...
- LoadRunner测试Google Suggest
Google的搜索框是典型的AJAX应用,用户在输入关键字的同时,前端页面通过xmlhttp与后台服务器动态交互,根据用户输入的关键字查找匹配的内容,向用户提示建议的搜索项,也就是所谓的“google ...
- google 浏览器使用技巧(一)
google 浏览器使用技巧(一) google 浏览器使用技巧 1. 调整地址栏的宽度 当安装多个插件的时候,默认插件会隐藏,所以使用起来很麻烦.在chrome 浏览器的配置中没有找到相应的配置.一 ...
- google搜索引擎使用方法
搜索引擎命令大全!这是一个我最喜欢的Google搜索技巧的清单: link:URL = 列出到链接到目标URL的网页清单. related:URL = 列出于目标URL地址有关的网页. site:ht ...
- Ajax及跨域
概念 Ajax Ajax,Asynchronous JavaScript and XML,字面意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术. 用于异步地去获 ...
- Ajax跨域实现
Ajax Ajax,Asynchronus JavaScript and XML,字母意思:异步的 JavaScript 和 XML,是指一种创建交互式网页应用的网页开发技术.用于异步地去获取XML作 ...
- Ajax工作原理
在写这篇文章之前,曾经写过一篇关于AJAX技术的随笔,不过涉及到的方面很窄,对AJAX技术的背景.原理.优缺点等各个方面都很少涉及null.这次写这篇文章的背景是因为公司需要对内部程序员做一个培训.项 ...
- java面试题总汇
coreJava部分 7 1.面向对象的特征有哪些方面? 7 2.作用域public,private,protected,以及不写时的区别? 7 3.String 是最基本的数据类型吗? 7 4.fl ...
- 【历史】JavaScript和Java没啥关系!————JavaScript简史
文章的开始先上张图: 图片拍摄自北京图书大厦,代表着现在国内应该是绝大部分书店的现状--Javascript书籍放在Java类当中.甚至很多业内人也一直认为Javascript是Java语言在浏览器内 ...
随机推荐
- oracle 相关笔记
1.查询语句执行顺序 from->where->[group by ]-> select ->distinct->count(某一列) 2.用命令执行存储过程用 exec ...
- 西数WD2T硬盘分区对齐的方法
新购一个西数2T硬盘,也就是绿盘的那种,淘宝500左右,支持高级格式化. 到手以后,分区格式化,前几天格式化完成以后,fdisk -l 发现如下文字 引用 Partition 1 does not s ...
- 老板让只懂Java基本语法的我,基于AQS实现一个锁
10 点整,我到了公司,又成为全组最后一个到的员工. 正准备刷刷手机摸摸鱼,看见老板神秘兮兮地走了过来. 老板:闪客呀,你写个工具,基于 AQS 实现一个锁,给咱们组其他开发用 我:哦好的 老板:你多 ...
- 【Redis】利用 Redis 实现分布式锁
技术背景 首先我们需要先来了解下什么是分布式锁,以及为什么需要分布式锁. 对于这个问题,我们可以简单将锁分为两种--内存级锁以及分布式锁,内存级锁即我们在 Java 中的 synchronized 关 ...
- git 最新笔记,工作中的必会技能
1.状态查看: git status 可以查看工作区,暂存区的状态 untracked 在暂存区没有该文件 modified 修改过 staged 使用git add 暂存过 2.添加操作: git ...
- ArrayList和LinkedList 的联系和区别
ArrayList和LinkedList 的联系和区别 1.联系: 都实现了List接口 有序 不唯一(可重复) 2.区别 ArrayList LinkedList
- hackrf GPS欺骗
在对GPS欺骗之前,先对GPS的知识做一个简单的介绍 GPS 系统本身非常复杂, 涉及到卫星通信等各个领域. 这里只是简单介绍一下. 我们通常所说的 GPS 全球定位系统是由美国国防部建造完成. 目前 ...
- Camtasia处理音频制作BGM
我们在剪辑自己录制的视频时经常会需要同时对音频进行处理,camtasia是一个可以对视频的音频或者单独的音频文件进行处理的软件,那我们就来看看到底如何使用camtasia 2019(Win)来处理音频 ...
- ABBYY FineReader 15快速转换文档详解
作为一款专业的"PDF编辑器",用户可通过使用ABBYY FineReader 15的"快速转换"功能,将各种格式的一个或多个文件合并PDF文档.Micros ...
- 教你调节Boom 3D的3D音效强度,让音乐更带感
Boom 3D的专业3D环绕技术,让用户能全身心地沉浸在立体音效中.无论是聆听音乐,还是观赏电影,立体音效都能为人们带来更加真实的听觉感触. 那么,Boom 3D的3D环绕功能到底能给用户带来怎样的体 ...