zm吃包子

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+;
int n,q,size,ans[N],ge,cnt1,cnt2,sh[N],dq[N],dui[N],cj,cc[N];
struct ztef
{
int x1,x2,y1,y2,k,id;
}a[N<<],huan2[N];
struct cha
{
int qi,ho;
}b[N],huan[N];
struct line
{
int he,ze1,ze2,pu,du;
}li[N<<];
string s,ss;
struct pigu
{
int er[N][],dfn[N],cnt,siz[N];
inline int insert(string x)
{
int len=x.size(),now=;
for(int i=;i<len;i++)
{
if(!er[now][x[i]-'a']) er[now][x[i]-'a']=++cnt;
now=er[now][x[i]-'a'];
}
return now;
}
inline void dfs(int now)
{
dfn[now]=++size;siz[now]=;
for(int i=;i<=;i++)
{
if(!er[now][i]) continue;
dfs(er[now][i]);
siz[now]+=siz[er[now][i]];
}
}
inline int cha(string x)
{
int now=,len=x.size();
for(int i=;i<len;i++)
{
if(!er[now][x[i]-'a']) return ;
now=er[now][x[i]-'a'];
}
return now;
}
}zh,fa;
inline int read()
{
char c=getchar();
int x=,f=;
while(!isdigit(c)) {if(c=='-') f=-;c=getchar();}
while(isdigit(c)) {x=(x<<)+(x<<)+c-'';c=getchar();}
return x*f;
}
inline int lowbit(int x)
{
return x&(-x);
}
inline void update(int now,int v)
{
while(now<=cj)
{
sh[now]+=v;
now+=lowbit(now);
}
}
inline int query(int now)
{
int daan=;
if(now<=) return ;
while(now)
{
daan+=sh[now];
now-=lowbit(now);
}
return daan;
}
inline bool cmp2(line x,line y)
{
return x.he<y.he;
}
inline bool cmp1(cha x,cha y)
{
return x.qi<y.qi;
}
inline void solve(int l,int r,int L,int R)
{
if(L>R) return;
if(l==r)
{
if(r==n+) for(int i=L;i<=R;i++) ans[dui[i]]=-;
else for(int i=L;i<=R;i++) ans[dui[i]]=l;
return;
}
int cn3=,mid=(l+r)>>,cn1=,cn2=;
for(int i=l;i<=mid;i++)
huan[++cn1]=b[i];
sort(huan+,huan+cn1+,cmp1);
for(int i=L;i<=R;i++)
{
if(ans[dui[i]]==-) continue;
li[++cn2]=(line){a[dui[i]].x1-,a[dui[i]].y1,a[dui[i]].y2,-,i};
li[++cn2]=(line){a[dui[i]].x2,a[dui[i]].y1,a[dui[i]].y2,,i};
}
sort(li+,li+cn2+,cmp2);
for(int i=;i<=cn2;i++)
{
while(cn3<=cn1&&huan[cn3].qi<=li[i].he)
{
update(huan[cn3].ho,);
cn3++;
}
dq[li[i].du]+=(query(li[i].ze2)-query(li[i].ze1-))*li[i].pu;
}
for(int i=;i<cn3;i++)
update(huan[i].ho,-);
int hu1=L,hu2=R;
for(int i=L;i<=R;i++)
{
if(dq[i]>=a[dui[i]].k)
cc[hu1++]=dui[i];
else
{
cc[hu2--]=dui[i];
a[dui[i]].k-=dq[i];
}
dq[i]=;
}
for(int i=L;i<=R;i++) dui[i]=cc[i];
solve(l,mid,L,hu1-);
solve(mid+,r,hu2+,R);
}
int main()
{
n=read();q=read();
for(int i=;i<=n;i++)
{
cin>>s;
b[i].qi=zh.insert(s);
reverse(s.begin(),s.end());
b[i].ho=fa.insert(s);
}
zh.dfs();size=;fa.dfs();
for(int i=;i<=n;i++)
{
b[i].qi=zh.dfn[b[i].qi];
b[i].ho=fa.dfn[b[i].ho];
}
cj=fa.cnt+;
for(int i=,x,y,z;i<=q;i++)
{
cin>>s>>ss>>z;
dui[i]=i;
reverse(ss.begin(),ss.end());
x=zh.cha(s);
y=fa.cha(ss);a[i].k=z;
if(x==||y==) {ans[i]=-;continue;}
a[i].id=i;
a[i].x1=zh.dfn[x];a[i].x2=zh.dfn[x]+zh.siz[x]-;
a[i].y1=fa.dfn[y];a[i].y2=fa.dfn[y]+fa.siz[y]-;
}
solve(,n+,,q);
for(int i=;i<=q;i++) cout<<ans[i]<<"\n";
return ;
}
zm吃包子的更多相关文章
- 嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法
嘉馨学姐又双叒叕来吃包子了 QDUOJ 模拟 尺度法 点我进入OJ题目详情 题意 给你一串数,让你求长度最长的子串,这个字串满足里面没有重复出现的数字. 解题思路 使用一个标记数组,来标记每个数的第一 ...
- Java实现 蓝桥杯 算法训练 猴子吃包子(暴力)
试题 算法训练 猴子吃包子 问题描述 从前,有一只吃包子很厉害的猴子,它可以吃无数个包子,但是,它吃不同的包子速度也不同:肉包每秒钟吃x个:韭菜包每秒钟吃y个:没有馅的包子每秒钟吃z个:现在有x1个肉 ...
- 初识python: 生成器并行(做包子,吃包子)
知识点: send(i) :唤醒yield,并将 i 的值传给 yield #!/user/bin env python # author:Simple-Sir # time:20181020 # 单 ...
- 等待唤醒机制代码实现_包子类&包子铺类和等待唤醒机制代码实现_吃货类&测试类
资源类:包子类 设置包子的属性 皮 陷 包子的状态:有 true 没有 false public class BaoZi { //皮 String pi; //陷 String xian; //包子的 ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- celery 框架
转自:http://www.cnblogs.com/forward-wang/p/5970806.html 生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据 ...
- python学习之路 第四天
1.函数动态参数: #!/usr/bin/env python3 def show(*sss,**eee): print(sss,type(sss)) prin ...
- Day5-python基础之函数(二)
生成器 迭代器 装饰器 模块 来个需求,一个列表中所有元素都+1 1.最容易想到的方法 for循环,找列表索引,对应每个值+1 list_old = [1,2,3,4,5,6,7,8,9] for ...
- Python之路,Day5 - Python基础5
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 一.列表生成器 , 1, 2, 3, 4, 5, 6, 7, 8, 9 ...
随机推荐
- .net连接数据库
/* 连接数据库步骤-- 1.创建连接字符串 data source = ... 计算机名称 initial catalog = ... 数据库名称 integrated security = tru ...
- P1077 子串乘积正负分类
题目描述 给你一个序列包含 \(n\) 个元素的序列 \(a_1, a_2, \dots , a_n\) (每个元素 \(a_i \ne 0\)). 你需要计算如下两个值: 有多少对数 \((l, r ...
- win10 uwp 发布旁加载自动更新
在很多企业使用的程序都是不能通过微软商店发布,原因很多,其中我之前的团队开发了很久的应用,结果发现没有用户能从微软应用商店下载所以我对应用商店没有好感.但是作为一个微软粉丝,怎么能不支持 UWP 开发 ...
- 递归实现深拷贝( 只要学过js递归,看不懂找我包会 )
要用递归实现深拷贝,首先说说什么是深拷贝和浅拷贝 浅拷贝:一个值赋给另一个值,当原先的值不改变地址的情况下改变数据,另一个值跟着变 深拷贝:一个值赋给另一个值,当原先的值不改变地址的情况下改变数据,另 ...
- 2018-8-10-win10-uwp-MVVM-语义耦合
title author date CreateTime categories win10 uwp MVVM 语义耦合 lindexi 2018-08-10 19:16:53 +0800 2018-2 ...
- linux 处理器特定的寄存器
如果你需要测量非常短时间间隔, 或者你需要非常高精度, 你可以借助平台依赖的资源, 一个要精度不要移植性的选择. 在现代处理器中, 对于经验性能数字的迫切需求被大部分 CPU 设计中内在的指令定时不 ...
- 20191029校内ACM部分题解
20191029校内ACM部分题解 https://codeforces.com/group/32W4q7bPme/contest/257710 B数学 给定一个在\([0,1]\)等概率随机区间的随 ...
- Yet Another Array Queries Problem CodeForces - 863D (暴力/思维)
You are given an array a of size n, and q queries to it. There are queries of two types: 1 li ri — p ...
- 利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。
正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的‘好’东西记 ...
- Struts2 注释类型
Struts 2 应用程序可以使用Java5注释作为替代XML和Java属性配置.这里是清单的不同的类别有关的最重要的注解: 命名空间注释(动作注释): @ Namespace注释允许在Action类 ...