Bless You Autocorrect!
题目链接:
https://odzkskevi.qnssl.com/0c87453efec2747f8e8a573525fd42f9?v=1533651456
题解:
这是一道Trie+BFS的题目; 这是第二次写了 Orz 还是WA好几发;
这一题,我们可以用字典树存已有的单词,在存的时候,记录一下该节点所能到达的最深的位置,并且记录它的父亲节点;
然后BFS跑一遍,对于每一步只有3种走法,走这一个字母,删除该位置的父亲字母,跳到它所能到达的最深位置;然后者
每一步都是在上一个字母的基础上步数加一的;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
const LL inf=0x3f3f3f3f3f3f3f3fLL;
const int maxn=2e6+;
const int sigma_size=;
char s[maxn]; struct Trie{
int ch[maxn][sigma_size];
int flag[maxn],fa[maxn],dep[maxn],vis[maxn];
int pos,root; int Idx(char ch) { return ch-'a'; } void Init()
{
pos=;root=;
memset(ch,,sizeof ch);
memset(dep,,sizeof dep);
memset(vis,,sizeof vis);
memset(flag,-,sizeof flag);
memset(fa,-,sizeof fa);
} void Insert(char *s)
{
int u=,n=strlen(s);
for(int i=;i<n;i++)
{
int c=Idx(s[i]);
if(!ch[u][c])
{
ch[u][c]=pos++;
fa[ch[u][c]]=u;
}
u=ch[u][c];
}
int end=u;
u=;
for(int i=;i<n;i++)
{
int c=Idx(s[i]);
u=ch[u][c];
if(flag[u]==-) flag[u]=end;
}
} void Search()
{
queue<int> q;
q.push(root); vis[root]=; dep[root]=;
while(!q.empty())
{
int u=q.front(); q.pop(); for(int i=;i<;i++)
{
if(!ch[u][i] || vis[ch[u][i]]) continue;
vis[ch[u][i]]=;
dep[ch[u][i]]=dep[u]+;
q.push(ch[u][i]);
} int v=fa[u];
if(v!=- && !vis[v])
{
vis[v]=;
dep[v]=dep[u]+;
q.push(v);
} v=flag[u];
if(v!=- && !vis[v])
{
vis[v]=;
dep[v]=dep[u]+;
q.push(v);
}
}
} int Query(char *s)
{
int u=,i;
for(i=;i<strlen(s);i++)
{
if(!ch[u][Idx(s[i])]) break;
u=ch[u][Idx(s[i])];
}
return dep[u]+strlen(s)-i; //没有的还要一个一个打上去
} } Tree; int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
Tree.Init();
for(int i=;i<=n;i++)
{
scanf("%s",s);
Tree.Insert(s);
}
Tree.Search();
for(int i=;i<=m;i++)
{
scanf("%s",s);
cout<<Tree.Query(s)<<endl;
}
}
return ;
}
Bless You Autocorrect!的更多相关文章
- [tire+最短路]Bless You Autocorrect!
[tire+最短路]Bless You Autocorrect! Typing on phones can be tedious. It is easy to make typing mistakes ...
- Urozero Autumn 2016. NCPC 2016
A. Artwork 倒过来并查集维护即可. #include<cstdio> #include<algorithm> using namespace std; const i ...
- Nordic Collegiate Programming Contest (NCPC) 2016
A Artwork B Bless You Autocorrect! C Card Hand Sorting D Daydreaming Stockbroker 贪心,低买高卖,不要爆int. #in ...
- ubuntu bless 16字节每行
打开Preferences配置 输入路径:/usr/share/bless/bless-16-bytes-per-row.layout 或者使用以下配置 cat /home/scue/.config/ ...
- autocapticalize和autocorrect
首字母自动大写autocapitalize 在 iOS 中,用户可以手动开启「首字母自动大写」功能,这样输入英文的时候,首字母便会自动大写.但是,有些时候并不希望一直是首字母大写的.比如用户名这个字段 ...
- perl 对象 通过bless实现
对象只是一种特殊的引用,它知道自己是和哪个类关联在一起的,而构造器知道如何创建那种关联关系. 这些构造器是通过使用bless操作符,将一个普通的引用物转换成一个对象实现的,
- perl 对象 bless 引用
[root@dr-mysql01 ~]# cat aa.pl use LWP::UserAgent; use Data::Dumper; my $ua = LWP::UserAgent->new ...
- 【Perl学习笔记】2. perl中的bless理解
bless有两个参数:对象的引用.类的名称. 类的名称是一个字符串,代表了类的类型信息,这是理解bless的关键. 所谓bless就是把 类型信息 赋予 实例变量. 程序包括5个文件:person.p ...
- BLESS学习笔记
BLESS全称:Bloom-filter-based Error Correction Solution for High-throughput Sequencing Reads,即基于布隆过滤器的高 ...
随机推荐
- Eclipse搭建Android开发环境并运行Android项目
Eclipse搭建Android开发环境并运行Android项目 (详细) 安装环境: window 10 64位 安装工具: JDK.Eclipse.SDK.ADT 安装步骤: 1.JAVA JDK ...
- Linux下rpm仓库搭建
一.概念 1.rpm是什么?在帮助文档里我们可以看到,rpm的名字是rpm package manage 的缩写, 从名字上看就可以知道rpm就是一个包管理工具.简单说rpm包就是把一些程序编译成二进 ...
- 在小程序中使用md5
使用md5.js的首先你要有md5.js这个文件https://github.com/emn178/js-md5 您也可以使用Bower安装js-md5. bower install md5 对于no ...
- java编程思想第四版第十章习题
第一题 package net.mindview.innerclasses; public class Outer { class Inner { Inner(){ System.out.printl ...
- nyoj 290 动物统计加强版 (字典树 (Trie) PS:map<TLE>)
动物统计加强版 时间限制:3000 ms | 内存限制:150000 KB 难度:4 描述 在美丽大兴安岭原始森林中存在数量繁多的物种,在勘察员带来的各种动物资料中有未统计数量的原始动物的名单 ...
- 力扣(LeetCode)移除元素 个人题解
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...
- shell——数组
默认从0开始索引:也可以单独(像字典一样)pid[35420]=httpd -k ssl, 只能是一维的 bash4.0增加了关联数组 数组赋值: declare -a myarray声明数组 一次一 ...
- VS Code 之 Jupyter NoteBook 初试
一.前言 在今年九月的 PyCon China 大会上,官宣了一项 VS Code Python 的全新功能:Visual Studio Code Python 插件将提供 Jupyter Noteb ...
- Tarjan-割点
割点——tarjan #include <bits/stdc++.h> using namespace std; ; ; int n, m; int ans;//个数 * MAXM], n ...
- word使用指南(经常更新)
一.快捷键 Ctrl+C 复制 Ctrl+X 剪切 Ctrl+V 粘贴 Ctrl+F 查找 Ctrl+A 全选 Ctrl+Z/Y 撤销/还原撤销 Ctrl+D 打开字体对话框 Ctrl+S 另存为 C ...