[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 这个题的核心 ...
随机推荐
- Windows as a Service(3)——使用SCCM管理Windows10更新
Hello 小伙伴们,这是这个系列的第三篇文章,我已经和大家分享了有关于Windows 10服务分支以及利用WSUS管理更新的方式,有兴趣的小伙伴们可以参考下面的链接: Windows as a Se ...
- yum 命令详解
一. yum 作用: yum 命令是在Fedora 和RedHat 以及SUSE 中基于rpm 的软件包管理器,它可以使系统管理人员交互和自动 ...
- MySQL: Integer & String types
Type Storage(bytes) Minimum Value Maximum Value TINYINT 1 -128/0 127/255 SMALLINT 2 -23768/0 23767/6 ...
- UWP 使用OneDrive云存储2.x api(二)【全网首发】
接上一篇 http://www.cnblogs.com/hupo376787/p/8032146.html 上一篇提到为了给用户打造一个完全无缝衔接的最佳体验,UWP开发者最好也要实现App设置和数据 ...
- C# 使用 CancellationTokenSource 终止线程
http://blog.csdn.net/hezheqiang/article/details/51966511 我们在多线程中通常使用一个 C# 使用 CancellationTokenSource ...
- SQL基础学习_01_数据库和表
SQL语句及其种类 1. SQL语句分为三类: DDL(Data Definition Language): CREATE.DROP.ALTER; DML(Data Manipulat ...
- Ajax同源和跨域
ajax跨域访问 客户端页面 var url = "http://172.16.91.121:81/FellIn/FellIn.aspx?Action=WXSave&WX_Store ...
- socket对象放在一个datagridview的row的tag里面在拿出来 为什么是已释放
socket对象放在一个datagridview的row的tag里面在拿出来 为什么是已释放
- 我的Python学习笔记(二):浅拷贝和深拷贝
在Python中,对象赋值,拷贝(浅拷贝和深拷贝)之间是有差异的,我们通过下列代码来介绍其区别 一.对象赋值 对象赋值不会复制对象,它只会复制一个对象引用,不会开辟新的内存空间 如下例所示,将test ...
- Java学习笔记18(Object类)
Object类是Java中最顶层的父类,所有类都是它的子类,接口不继承它 Object类中的方法: 官方资料:boolean equals(Object obj) 指示其他某个对象是否与此对象&qu ...