[bzoj1819] [JSOI]Word Query电子字典
正解是trie树。。。在树上跳来跳去什么的
然而在企鹅qq那题的影响下我写了hash。。。
添加一个字母到一个串,就相当于另一个串删对应位置上的字母。
改变某个位置上的字母,就相当于两个字符串删掉同一个位置上的字母。
所以要记录的东西也不多。。存一下每个串删掉每个位置上的字母后的hash值并排序,然后查询的时候二分一下就行了。
但要注意的是,两个字符串可能有多种编辑方式。。。比方说字符串cccc,分别删掉四个位置上的字母后得到的都是ccc。。
所以一开始要再去一下重。(要不是老司机提醒我还不知道要调多久TAT
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define ull unsigned long long
using namespace std;
const int maxn=;
ull mp[][maxn];
ull b[],jc[],pre[];
ull map[*maxn];
int len[maxn],num[];
int i,j,k,n,m,l,r,mid,cnt,ans;
char s[];
inline int getl(int x,ull v){
for(l=,r=num[x];l<r;)
if(mp[x][mid=(l+r)>>]<v)l=mid+;else r=mid;
return mp[x][l]==v?l:;
}
inline int getr(int x,ull v){
for(l=,r=num[x];l<r;)
if(mp[x][mid=(l+r+)>>]<=v)l=mid;else r=mid-;
return mp[x][l]==v?l:;
}
inline int get(int ull v){
int posl;
for(l=,r=cnt;l<r;)
if(map[mid=(l+r)>>]<v)l=mid+;else r=mid;
if(map[l]!=v)return ;
if(map[l+]!=v)return ;
posl=l;
for(l=posl,r=cnt;l<r;)
if(map[mid=(l+r+)>>]<=v)l=mid;else r=mid-;
return l-posl+;
}
int main(){
register int j;
scanf("%d%d",&n,&m);
for(i=jc[]=;i<=;i++)jc[i]=jc[i-]*;
int mx=;num[]=n;
for(i=;i<=n;i++){
scanf("%s",s);len[i]=strlen(s);
for(j=;j<=len[i];j++)pre[j]=pre[j-]*+s[j-];
for(j=;j<=len[i];j++)
mp[j][++num[j]]=pre[len[i]]-pre[j]*jc[len[i]-j]+pre[j-]*jc[len[i]-j];
mp[][i]=pre[len[i]];
mx=max(mx,len[i]);
for(j=;j<=len[i];j++)b[j]=mp[j][num[j]];
sort(b+,b++len[i]);
for(j=len[i];j;j--)if(j==len[i]||b[j+]!=b[j])map[++cnt]=b[j];//,printf(" %lld\n",b[j]);
// printf("! %lld\n",mp[1][num[1]]);
}
for(i=;i<=mx;i++)sort(mp[i]+,mp[i]++num[i]);
sort(map+,map++cnt);
// for(i=0;i<=mx;i++){
// for(j=1;j<=num[i];j++)printf(" %lld",mp[i][j]);puts("");
// }
ull tmp;
while(m--){
scanf("%s",s);int len=strlen(s);
for(j=;j<=len;j++)pre[j]=pre[j-]*+s[j-];
if((k=getl(,pre[len]))){puts("-1");continue;} ans=get(pre[len]);//printf(" %d\n",ans);
for(j=;j<=len;j++){
tmp=b[j]=pre[len]-pre[j]*jc[len-j]+pre[j-]*jc[len-j];
if((k=getl(j,tmp)))ans+=getr(j,tmp)-k+;
} sort(b+,b++len);
for(j=len;j;j--)
if(j==len||b[j+]!=b[j])
if((k=getl(,b[j])))
ans+=getr(,b[j])-k+; printf("%d\n",ans);
}
return ;
}
[bzoj1819] [JSOI]Word Query电子字典的更多相关文章
- BZOJ1819 [JSOI]Word Query电子字典 Trie
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1819 题意概括 字符串a与字符串b的编辑距离是指:允许对a或b串进行下列“编辑”操作,将a变为b或 ...
- 2786: [JSOI]Word Query电子字典
2786: [JSOI]Word Query电子字典 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 3 Solved: 3[Submit][Statu ...
- 1819: [JSOI]Word Query电子字典
1819: [JSOI]Word Query电子字典 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 729 Solved: 238[Submit][S ...
- bzoj 1819: 电子字典 Trie
题目: Description 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功 ...
- 洛谷P4407 [JSOI2009]电子字典
题目描述 人们在英文字典中查找某个单词的时候可能不知道该单词的完整拼法,而只知道该单词的一个错误的近似拼法,这时人们可能陷入困境,为了查找一个单词而浪费大量的时间.带有模糊查询功能的电子字典能够从一定 ...
- 改变word的语言字典
改变word的语言字典 上周末看论坛有人提出否有方法用代码改变word的语言字典,因为默认的语言会影响现用语言输入的拼写器和其他校对工具.我们的Spire.doc正好支持,正好闲来无事所以我用西班牙语 ...
- [LeetCode] Longest Word in Dictionary 字典中的最长单词
Given a list of strings words representing an English Dictionary, find the longest word in words tha ...
- 6.C语言文件操作之英语电子字典的实现,dos版
多的不说,直接上代码: 里面涉及的字典文件在这:这是传送门,下载下来以后把该文件放在工程目录下即可 #define _CRT_SECURE_NO_WARNINGS #include <stdio ...
- [leetcode]720. Longest Word in Dictionary字典中最长的单词
b.compareTo(a) 这个函数是比较两个值得大小,如果b比a大,那么返回1 如果小,那么返回-1,相等返回0 如果比较的是字符串,那么比较字典编纂顺序,b靠前返回-1,靠后返回1 这个题的核心 ...
随机推荐
- C#备份一个文件到指定的文件夹里面
一开始我的想法是这样的: //在控制台里面操作 static void Main(string[] args) { //backup( @"D:\gg\config.xml", @ ...
- iOS开发--数据库管理CoreData的使用
CoreData是iOS5后,苹果提供的原生的用于对象化管理数据并且持久化的框架.CoreData本质上是将底层数据库封装成对象进行管理.但数据库实际上只是CoreData的一个功能,并不是全部功能. ...
- 通过SQL创建一个有主键自动递增有默认值不为空有注释的表
-- create database db_std_mgr_sys; use db_std_mgr_sys; create table student( std_id bigint not null ...
- AdaBoost对实际数据分类的Julia实现
写在前面 AdaBoost是机器学习领域一个很重要很流行的算法,而Julia是一门新兴的发展迅速的科学计算语言.本文将从一个实际例子出发,展示如何用Julia语言实现AdaBoost算法. 什么是Ad ...
- Visual studio code离线安装插件
Visual studio code离线安装插件 公司研发区不能连接公网,使用Visual studio code(vsc)写Golang代码需要安装Go插件,下面介绍下,vsc离线安装插件的步骤.以 ...
- [摘抄]VC6.0移植到VS2008(vs2005)后的错误总结(未全部验证)
============================================================================================= 201405 ...
- 在ubuntu上安装pyenv出现的问题
1.安装完pyenv时,并没有出现问题.但在安装python3.6.1时报错: ERROR: The Python ssl extension was not compiled. Missing th ...
- 三十天学不会TCP,UDP/IP网络编程-TraceRoute的哲学
新年快乐,继续来部分粘贴复制我的这一系列文章啦,如果对和程序员有关的计算机网络知识,和对计算机网络方面的编程有兴趣,欢迎去gitbook(https://www.gitbook.com/@rogerz ...
- Word+PS制作拼音表格
这几天,朋友让帮忙做个拼音表格,使用Word可以直接标注音标,却无法实现小时候那种4线3格,Word的模板只有练习书法的.使用Excel却,无法将拼音标注单独标注到上一单元格(有朋友会VBA的话,帮我 ...
- CSS 的优先级机制[总结]
样式的优先级 多重样式(Multiple Styles):如果外部样式.内部样式和内联样式同时应用于同一个元素,就是使多重样式的情况. 一般情况下,优先级如下: (外部样式)External styl ...