思路:

网上的题解有AC自动机的,有trie树的,还有(乱搞?)的

首先把输入的那n个串按照字典序排序,

把n个串翻转以后再按照字典序排序

这样我们发现, 查的前缀在字典序排序后是一段区间,

查的后缀翻转一下在翻转后的字典序排序以后也是一段区间

这样如果不考虑重叠的问题,就是一个简单的二维数点问题,一维排序,一维线段树即可解决

如果有重叠的问题,我们需要搞出来每个字符串的长度,使给出的前缀长+后缀长>=原字符串长度

此时题目变成了三维偏序,排序后树套树即可。

//By SiriusRen
#include <bits/stdc++.h>
using namespace std;
const int N=;
int cases,n,q,root[N<<],cnt,tree[N*],lson[N*],rson[N*];
struct Node{string str;int id,len;}X[N],Y[N],tmp;
bool operator<(Node a,Node b){return a.str<b.str;}
struct Pnt{int x,y,z;}p[N];
struct Ask{int xl,xr,yl,yr,z,id,ans;}ask[N];
bool cmp1(Pnt a,Pnt b){return a.z>b.z;}
bool cmp2(Ask a,Ask b){return a.z>b.z;}
bool cmp3(Ask a,Ask b){return a.id<b.id;}
void Insert(int l,int r,int &pos,int wei){
if(!pos)pos=++cnt;tree[pos]++;
if(l==r)return;
int mid=(l+r)>>;
if(mid>=wei)Insert(l,mid,lson[pos],wei);
else Insert(mid+,r,rson[pos],wei);
}
void insert(int l,int r,int pos,int num,int wei){
Insert(,n,root[pos],wei);
if(l==r)return;
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
if(mid<num)insert(mid+,r,rson,num,wei);
else insert(l,mid,lson,num,wei);
}
int Query(int l,int r,int pos,int L,int R){
if(l>=L&&r<=R)return tree[pos];
int mid=(l+r)>>;
if(mid<L)return Query(mid+,r,rson[pos],L,R);
else if(mid>=R)return Query(l,mid,lson[pos],L,R);
else return Query(l,mid,lson[pos],L,R)+Query(mid+,r,rson[pos],L,R);
}
int query(int l,int r,int pos,int xl,int xr,int yl,int yr){
if(l>=xl&&r<=xr)return Query(,n,root[pos],yl,yr);
int mid=(l+r)>>,lson=pos<<,rson=pos<<|;
if(mid<xl)return query(mid+,r,rson,xl,xr,yl,yr);
else if(mid>=xr)return query(l,mid,lson,xl,xr,yl,yr);
else return query(l,mid,lson,xl,xr,yl,yr)+query(mid+,r,rson,xl,xr,yl,yr);
}
int main(){
ios::sync_with_stdio(false);
cin>>cases;
while(cases--){
memset(tree,,sizeof(int)*(cnt+));
memset(lson,,sizeof(int)*(cnt+));
memset(rson,,sizeof(int)*(cnt+));
memset(root,,sizeof(root));cnt=;
cin>>n>>q;
for(int i=;i<=n;i++)cin>>X[i].str;
sort(X+,X++n);
for(int i=;i<=n;i++)X[i].id=i,X[i].len=X[i].str.length();
for(int i=;i<=n;i++)Y[i]=X[i];
for(int i=;i<=n;i++)reverse(Y[i].str.begin(),Y[i].str.end());
sort(Y+,Y++n);
for(int i=;i<=n;i++)p[i].x=Y[i].id,p[i].y=i,p[i].z=Y[i].len;
for(int i=;i<=q;i++){
string pre,suf;cin>>pre>>suf;
ask[i].id=i;tmp.str=pre;
ask[i].xl=lower_bound(X+,X++n,tmp)-X;
tmp.str=pre,tmp.str.push_back('z'+);
ask[i].xr=lower_bound(X+,X++n,tmp)-X-;
tmp.str=suf,reverse(tmp.str.begin(),tmp.str.end());
ask[i].yl=lower_bound(Y+,Y++n,tmp)-Y;
tmp.str.push_back('z'+);
ask[i].yr=lower_bound(Y+,Y++n,tmp)-Y-;
ask[i].z=pre.size()+suf.size();
}
sort(p+,p++n,cmp1);sort(ask+,ask++q,cmp2);
int tt=;
for(int i=;i<=q;i++){
while(p[tt].z>=ask[i].z&&tt<=n)insert(,n,,p[tt].x,p[tt].y),tt++;
if(ask[i].xl>ask[i].xr||ask[i].yl>ask[i].yr){ask[i].ans=;continue;}
ask[i].ans=query(,n,,ask[i].xl,ask[i].xr,ask[i].yl,ask[i].yr);
}sort(ask+,ask++q,cmp3);
for(int i=;i<=q;i++)cout<<ask[i].ans<<endl;
}
}

HDU 6096 树套树的更多相关文章

  1. hdu 4417 Super Mario/树套树

    原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=4417 题意很简单,给定一个序列求一个区间 [L, R,]中小于等于H的元素的个数. 好像函数式线段树可 ...

  2. hdu 4819 Mosaic 树套树 模板

    The God of sheep decides to pixelate some pictures (i.e., change them into pictures with mosaic). He ...

  3. BZOJ 3110: [Zjoi2013]K大数查询 [树套树]

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6050  Solved: 2007[Submit][Sta ...

  4. BZOJ4170 极光(CDQ分治 或 树套树)

    传送门 BZOJ上的题目没有题面-- [样例输入] 3 5 2 4 3 Query 2 2 Modify 1 3 Query 2 2 Modify 1 2 Query 1 1 [样例输出] 2 3 3 ...

  5. bzoj3262: 陌上花开(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  6. bzoj3295: [Cqoi2011]动态逆序对(树套树)

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  7. BZOJ 3110 k大数查询 & 树套树

    题意: 有n个位置,每个位置可以看做一个集合,现在要求你实现一个数据结构支持以下功能: 1:在a-b的集合中插入一个数 2:询问a-b集合中所有元素的第k大. SOL: 调得火大! 李建说数据结构题能 ...

  8. BZOJ 3110 树套树 && 永久化标记

    感觉树套树是个非常高深的数据结构.从来没写过 #include <iostream> #include <cstdio> #include <algorithm> ...

  9. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树套树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 这题调了我相当长的时间,1wa1a,我是第一次写树套树,这个是树状数组套splay,在每个区间 ...

随机推荐

  1. 搭建网络svn实战

    工作中的问题(7) 转自:http://blog.csdn.net/xiaoting451292510/article/details/8562570 经常性我们和朋友写一些程序,大家在不同的城市确有 ...

  2. 【转】Wireshark技巧-过滤规则和显示规则

    原文: http://www.cnblogs.com/icez/p/3973873.html ----------------------------------------------------- ...

  3. IntelliJ IDEA 基本配置入门

    前言:今天下载安装IntelliJ IDEA.随手创建了一个项目,运行Build提示错误. 与大多数用于开发JAVA的IDE类似,不做不论什么配置.编译是不会成功的.因此我尝试对IDEA的配置进行了一 ...

  4. Office WORD如何去掉目录的背景灰色

    有人说鼠标点击空白的地方灰色就自动散掉了,但是我点击并没有散掉 鼠标选中有灰色背景的文字,点击格式-边框和底纹,点击无填充颜色,并应用于文字. O了

  5. 自己定义控件 播放GIF动画

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/ ...

  6. 【Java集合源代码剖析】HashMap源代码剖析

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/36034955 您好,我正在參加CSDN博文大赛,假设您喜欢我的文章.希望您能帮我投一票.谢 ...

  7. win10访问共享文件夹提示:引用的账户当前已锁定,且当前可能无法登陆

    最近一台电脑访问windows 2008 R2 server的共享文件夹.没有使用域环境. win10界面提示:引用的账户当前已锁定,且当前可能无法登陆. 登陆2008发现,该账户的确锁定.猜测可能该 ...

  8. Pulse-code modulation

    脉冲编码调制(Pulse Code Modulation,PCM),由A.里弗斯于1937年提出的,这一概念为数字通信奠定了基础,60年代它开始应用于市内电话网以扩充容量,使已有音频电缆的大部分芯线的 ...

  9. Nginx——静态资源服务器(一)

    java web的项目中,我们经常将项目部署到Tomcat或者jetty上,可以通过Tomcat或者jetty启动的服务来访问静态资源.但是随着Nginx的普及,用Nginx来作为静态资源服务器,似乎 ...

  10. 【Idea】Debug模式

    Idea则是把手标放到你想显示结果的代码上,按Ctrl+F1就显示结果. 如果你想跳到下一个断点直接按F9