HDU - 6096 处理后缀的字典树
题意:给定n个字符串,m次询问,每次询问多少个字符串前缀是pre且后缀是suf,前后缀不可相交
字典树同时存储前后缀,假设字符串长为len则更新2*len个节点,依次按s[0],s[len-1],s[1],s[len-2],s[2]...更新
对于询问,按pre[0],suf[len2-1],pre[1],suf[len2-2],...pre[len1-1],suf[0]查询
如果前后缀不等长则用特殊字符填充,询问若碰到特殊字符就当前层暴搜(由于后一层前后缀肯定存在确定字符,所以不会被卡)
必须要确保的是询问时字典树中任一字符串必须长度大于等于当前查询的前后缀长度和(xxx xx xx非法)
因此需要离线处理
时间复杂度\(O(能过)\)
#include<bits/stdc++.h>
#define rep(i,j,k) for(register int i=j;i<=k;i++)
#define rrep(i,j,k) for(register int i=j;i>=k;i--)
#define println(a) printf("%lld\n",(ll)a)
using namespace std;
const int MAXN = 2e5 + 11;
const int MOD = 1e9+7;
typedef long long ll;
const ll INF = 1ll<<62;
ll read(){
ll x = 0, f = 1; register char ch = getchar();
while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0'&&ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x*f;
}
string str[MAXN];
bool cmp(const string &a,const string &b){
return a.length()<b.length();
}
struct Q{
string pre,suf;
int id,len;
Q(){};
Q(string a,string b,int _id){
pre=a;
suf=b;
id=_id;
len=pre.length();
len+=suf.length();
if(pre.length()<suf.length()){
for(int i=pre.length();i<suf.length();i++){
pre.push_back('@');
}
}else if(suf.length()<pre.length()){
string t((int)pre.length()-suf.length(),'@');
suf=t+suf;
}
}
bool operator < (const Q &QAQ) const{
return len<QAQ.len;
}
}q[MAXN];
int ans[MAXN];
const int MAXV = 3e6+11;
struct Trie{
int son[MAXV][26];
int size[MAXV];
int tot,root;
void init(){
root=tot=1;
size[root]=0;
rep(i,0,25) son[root][i]=0;
}
int node(){
++tot;
size[tot]=0;
rep(i,0,25) son[tot][i]=0;
return tot;
}
void insert(const string &str){
int o=root,t;
int cur1=0,cur2=str.length();
int len=2*str.length();
for(int i=0;i<len;i++){
if(i&1) t=--cur2;
else t=cur1++;
size[o]++;
int wh=str[t]-'a';
if(son[o][wh]==0) son[o][wh]=node();
o=son[o][wh];
}
size[o]++;
}
int ans;
void query(int o,int dep,const string &s){
if(o==0) return;
if(dep==s.length()){
ans+=size[o];
return;
}
if(s[dep]=='#'||s[dep]=='@'){
for(int j=0;j<26;j++) query(son[o][j],dep+1,s);
}else{
query(son[o][s[dep]-'a'],dep+1,s);
}
}
}trie;
int main(){
ios::sync_with_stdio(false);
int T; cin>>T;
while(T--){
int n,m;
cin>>n>>m;
rep(i,1,n) cin>>str[i];
sort(str+1,str+1+n,cmp);
string a,b;
rep(i,1,m){
cin>>a>>b;
q[i]=Q(a,b,i);
}
sort(q+1,q+1+m);
trie.init();
int cur=n;
string s;
rrep(i,m,1){
while(cur>0&&str[cur].length()>=q[i].len){
trie.insert(str[cur]);
cur--;
}
s.clear();
int len=2*q[i].pre.length();
int cur1=0,cur2=len>>1;
for(int j=0;j<len;j++){
char ch;
if(j&1) ch=q[i].suf[--cur2];
else ch=q[i].pre[cur1++];
s.push_back(ch);
}
trie.ans=0; trie.query(1,0,s);
ans[q[i].id]=trie.ans;
}
rep(i,1,m){
cout<<ans[i]<<endl;
}
}
return 0;
}
HDU - 6096 处理后缀的字典树的更多相关文章
- HDU 4287 Intelligent IME(字典树数组版)
Intelligent IME Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU 4757 Tree 可持久化字典树
Tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4757 Des ...
- hdu 4099 Revenge of Fibonacci 字典树+大数
将斐波那契的前100000个,每个的前40位都插入到字典树里(其他位数删掉),然后直接查询字典树就行. 此题坑点在于 1.字典树的深度不能太大,事实上,超过40在hdu就会MLE…… 2.若大数加法时 ...
- HDU 1247 - Hat’s Words - [字典树水题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1247 Problem DescriptionA hat’s word is a word in the ...
- HDU 1251 统计难题(字典树模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=1251 题意:给出一些单词,然后有多次询问,每次输出以该单词为前缀的单词的数量. 思路: 字典树入门题. #inc ...
- HDU 1251 统计难题(字典树 裸题 链表做法)
Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己 ...
- TOJ3097: 单词后缀 (字典树 or map瞎搞)
传送门 (<---可以点击的~) 时间限制(普通/Java):1000MS/3000MS 内存限制:65536KByte 描述 有些英语单词后缀都是一样的,现在我们需要从给定的一堆单词里 ...
- hdu 1251 统计难题(字典树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1251 统计难题 Time Limit: 4000/2000 MS (Java/Others) M ...
- HDU 5715 XOR 游戏 二分+字典树
XOR 游戏 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5715 Description 众所周知,度度熊喜欢XOR运算(XOR百科). 今天,它 ...
随机推荐
- Executing a Finite-Length Task in the Background
[Executing a Finite-Length Task in the Background] Apps that are transitioning to the background can ...
- 启动项目报错:502 Server dropped connection The following error occurred while trying to access http://localhost:8080/TestDemo:
之前的项目一直是好的,可以启动,但最近启动出了问题,访问不了,于是找到原因发现是启用了访问国外网站的加速器, 更改了浏览器的代理模式,如下: 解决方法: 打开浏览器,进入到浏览器的网络设置中,将局域网 ...
- Struts+Spring+Hibernate整合
这段笔记三两年前写的,一直因为一些琐事,或者搞忘记了,没有发.今天偶然翻出了它,就和大家一起分享下吧. 1.导入jar包 Struts的jar包: Spring的jar包: Hibernate的jar ...
- polymer-quick tour of polymer
注册一个元素 <link rel="import" href="bower_components/polymer/polymer.html">//没 ...
- Android-有序广播是可以中断的
在之前的博客,Android-广播概念,中介绍了(广播和广播接收者)可以组件与组件之间进行通讯,有两种类型的广播(无序广播 和 有序广播),这篇博客就来讲解有序广播的代码实现: 有序广播:接收者 可以 ...
- SQLServer中数据加密方法
对SQLServer中的数据进行加密,有三种方法, 1. 在程序语言中先对数据进行加密后再把加密后的数据保存在SQLServer数据库中: 2. 利用SQLServer未公开的加密密码函数,在SQ ...
- [转]RTH试用手记之“额外功能”
年初,罗德与施瓦茨公司(Rohde & Schwarz)推出了第一款的手持示波器,从指标上看,该示波器打破了传统手持器功能简单.指标水平低.结构粗糙的印象,取而代之达到了主流台式数字示波器的性 ...
- spring+quartz的任务调度
公司网站有个功能是自动投标,还有定时更新用户的排名信息,这些都是spring+quartz实现的. 手机了一些资料,做一个小demo,加深理解,记录一下,以后使用的时候不会出什么问题. 需要的包,主要 ...
- CHARPTER 3--INDEX DMVs
1.查找最重要的缺失的索引 --======================================================= --查找最重要的缺失的索引 ) DB_NAME() AS ...
- Jenkins HA高可用参考
商用版Jenkins(CloudBee)提供HA插件,开源版本可以借助etcd服务发现+心跳脚本+sync的方式实现高可用.