[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 这个题的核心 ...
随机推荐
- Hibernate学习---Configuration,Session,SessionFactory
上一节我们讲到了Hibernate的测试,并且给出了测试代码,刚开始看见这个测试代码的同学估计是一头雾水把,所以这一节我们来讲一下测试代码. 本节主要内容: Configuration Session ...
- IDS 源镜像端口添加
把核心交换机的G1/2口镜像到目的交换机的G1/4口,两个交换机之间都是连接的24口 1.核心交换机配置 Ruijie# configure tRuijie(config)# vlan 77Ruiji ...
- scala写算法-List、Stream、以及剑指Offer里部分题目基于scala解法
Stream(immutable) Stream是惰性列表.实现细节涉及到lazy懒惰求值.传名参数等等技术(具体细节详见维基百科-求值策略). Stream和List是scala中严格求值和非严格求 ...
- echarts中如何使用timeline组件
1.吃碗面 这里关于echarts3 官网的示例我不得不吐槽一下,逼格真高!一小部分示例动不动数据就是国家统计局搞出来的,你脸真大.当然他们做的示例的确是很好,这一点毫无疑问.当我看了echarts3 ...
- [UWP]了解IValueConverter
1. 前言 IValueConverter是用于数据绑定的强大的武器,它用于Value在Binding Source和Binding Target之间的转换.本文将介绍IValueConverter的 ...
- 用HTML5和原生js实现放大局部图片
drawImage方法 context.drawImage(image,sx,sy,sh,dx,dy,dw,dh) sx\sy起始图像的横纵坐标,sh\sd起始图像的大小,dx\dy复制图像的横纵坐标 ...
- 联想笔记本电脑 Z500除尘过程
首先说明联想z500真的是特别难拆,主要是C面的键盘如果没有垫片的话很难拆下,建议准备好垫片再进行. 第一步 首先拆掉背面的五个螺丝钉,然后打开四个垫子注意方向,把隐藏的另外四个螺丝拆掉. 第二步 把 ...
- 【转】java.lang.NoSuchMethodError: javax.persistence.Table.indexes()[Ljavax/persistence/Index;
最近在配置最新的ssh(struts2.3.16.3+hibernate4.3.7+spring4.1.2)的时候遇到的这个错误提示,后来在网上找了半天都不能解决,虽然有个说法是model对象用这样@ ...
- python科学计算_numpy_ndarray
ndarray:n-dimensional array object,即多维数组对象,是python自带的array对象的扩展,array对象和list对象的区别是array对象的每一个元素都是数值, ...
- spring boot 之热部署(三)
热部署:当发现程序修改时自动启动应用程序. spring boot使用的是spring-boot-devtools是一个为开发者服务的一个模块.其原理用了classLoader 其中一个加载不变的类, ...