LINK:qiqi20021026的T1



考场上只拿到了50分的\(nq\)暴力。

考虑一个区间和一个区间配对怎么做 二分图最大带权匹配复杂度太高。

先考虑LCS的问题 常见解决方法是后缀数组/trie树.

一个贪心是 每次让贡献最大的一对配对是最优的策略。

具体证明可以利用扰动法 或者观察法。

即设\(p,q,l,r\) 分类讨论一下情况就行辣 怎么证明全局最优?可以发现任意两个匹配都是这样最优 交换会变得更差 这样应该可以说明全局最优了吧?

这个贪心直接做复杂度还是很高 可以考虑trie树上做 那么就是在LCA处匹配 匹配不了到父亲处.

这样复杂度就是\(n\cdot q\)的了.

考虑正解:写完暴力我一度认为这题感觉是一个二维莫队。

但是我发现每次多加一个字符串的贡献非常难处理 所以就不会了。

一个非常套路 且我见过很多次就是没反应过来的套路 是 观察这个贡献 后缀长度 其实可以均摊到路径上的节点上.

即对于每个节点取 min(a,b)即可得到贡献。

这样一个串就对应到了一条路径上 且每个节点的min(a,b)这种贡献都是可以O(1)计算的。

然后考虑莫队 直接 序列上(trie树此时其实也是一个序列)莫队+序列上莫队 这样一共存在四个指针。

分块的大小要调整好 可以奇偶优化分块 复杂度不太清楚 (反正轻轻松松跑过5e5

code
//#include<bits\stdc++.h>
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<string>
#include<ctime>
#include<cmath>
#include<cctype>
#include<cstdlib>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<algorithm>
#include<utility>
#include<bitset>
#include<set>
#include<map>
#define ll long long
#define db double
#define INF 1000000000
#define ldb long double
#define pb push_back
#define put_(x) printf("%d ",x);
#define get(x) x=read()
#define gt(x) scanf("%d",&x)
#define gi(x) scanf("%lf",&x)
#define put(x) printf("%d\n",x)
#define putl(x) printf("%lld\n",x)
#define gc(a) scanf("%s",a+1)
#define rep(p,n,i) for(RE int i=p;i<=n;++i)
#define go(x) for(int i=lin[x],tn=ver[i];i;tn=ver[i=nex[i]])
#define fep(n,p,i) for(RE int i=n;i>=p;--i)
#define vep(p,n,i) for(RE int i=p;i<n;++i)
#define pii pair<int,int>
#define mk make_pair
#define RE register
#define P 1000000007
#define gf(x) scanf("%lf",&x)
#define pf(x) ((x)*(x))
#define uint unsigned long long
#define ui unsigned
#define EPS 1e-4
#define sq sqrt
#define S second
#define F first
#define mod 1000000007
#define len(x) t[x].len
using namespace std;
//无奈 太菜了 签到题都只能暴力 我真是个弱智./kk
const int MAXN=10010,maxn=500010;
int n,Q,len,cnt,ans,id=1,B=100;
int t[MAXN][26],pos[MAXN],sum[maxn],wl[MAXN],wr[MAXN],c[MAXN];
struct wy{int l,r,L,R,id;}q[maxn];
string a;
inline void insert()
{
int now=1;
vep(0,a.size(),i)
{
int ww=a[i]-'a';
if(!t[now][ww])t[now][ww]=++id;
now=t[now][ww];pos[++cnt]=now;
}
}
inline int cmp(wy a,wy b)
{
if(a.l/B!=b.l/B)return a.l<b.l;
if(a.r/B!=b.r/B)return a.l/B&1?a.r<b.r:a.r>b.r;
if(a.L/B!=b.L/B)return a.r/B&1?a.L<b.L:a.L>b.L;
return a.L/B&1?a.R<b.R:a.R>b.R;
}
inline void add(int x)
{
++c[pos[x]]>0?++ans:--ans;
}
inline void del(int x)
{
--c[pos[x]]<0?++ans:--ans;
}
int main()
{
//freopen("1.in","r",stdin);
freopen("qiqi.in","r",stdin);
freopen("qiqi.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n>>Q;
rep(1,n,i)
{
a="";cin>>a;
reverse(a.begin(),a.end());
wl[i]=cnt+1;insert();wr[i]=cnt;
}
rep(1,Q,i)
{
int l,r;cin>>l>>r;
q[i].l=wl[l];q[i].r=wr[r];
sum[i]+=wr[r]-wl[l]+1;
cin>>l>>r;q[i].id=i;
q[i].L=wl[l];q[i].R=wr[r];
sum[i]+=wr[r]-wl[l]+1;
}
sort(q+1,q+1+Q,cmp);
int l=1,r=0,L=1,R=0;
rep(1,Q,i)
{
while(l>q[i].l)add(--l);
while(l<q[i].l)del(l),++l;
while(L>q[i].L)del(--L);
while(L<q[i].L)add(L),++L;
while(r<q[i].r)add(++r);
while(r>q[i].r)del(r),--r;
while(R<q[i].R)del(++R);
while(R>q[i].R)add(R),--R;
sum[q[i].id]-=ans;
}
rep(1,Q,i)put(sum[i]>>1);
return 0;
}

7.11 NOI模拟赛 qiqi20021026的T1 四个指针莫队 trie树的更多相关文章

  1. 7.11 NOI模拟赛 graph 生成函数 dp 多项式

    LINK:graph HDU题库里的原题 没做过自闭. 考虑dp 设\(f_{i,j}\)表示前i个点构成j个联通块是树的方案数. 对于一次询问答案即为\(\sum_{j}f_{n,j}j^k\) 考 ...

  2. 9.11 myl模拟赛

    9.11 myl 模拟赛 100 + 100 + 0 第一题耗费了太多的时间,导致最后一题没有时间想,直接去写了暴力,而且出题人没有给暴力分.... Problem 1. superman [题目描述 ...

  3. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  4. NOI模拟赛 Day1

    [考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧 ...

  5. 6.28 NOI模拟赛 好题 状压dp 随机化

    算是一道比较新颖的题目 尽管好像是两年前的省选模拟赛题目.. 对于20%的分数 可以进行爆搜,对于另外20%的数据 因为k很小所以考虑上状压dp. 观察最后答案是一个连通块 从而可以发现这个连通块必然 ...

  6. NOI模拟赛Day5

    T1 有and,xor,or三种操作,每个人手中一个数,求和左边进行某一种运算的最大值,当t==2时,还需要求最大值的个数. test1 20% n<=1000 O(n^2)暴力 test2 2 ...

  7. 【2018.12.17】NOI模拟赛4

    题目 WZJ题解 T1 T2 T3 后缀自动机+($parents$ 树)树链剖分 发现有大量子串需要考虑,考虑摁死子串的一端. 首先,这题显然是一道离线题,因为所有的询问都是 $1$ 到 某个数,也 ...

  8. NOI.AC省选模拟赛第一场 T1 (树上高斯消元)

    link 很容易对于每个点列出式子 \(f_{x,y}=(f_{x,y-1}+f_{x,y}+f_{x,y+1}+f_{x+1,y})/4\)(边角转移类似,略) 这个转移是相互依赖的就gg了 不过你 ...

  9. 2017.6.11 NOIP模拟赛

    题目链接: http://files.cnblogs.com/files/TheRoadToTheGold/2017-6.11NOIP%E6%A8%A1%E6%8B%9F%E8%B5%9B.zip 期 ...

随机推荐

  1. CentOS7下安装和配置SVN

    1. 由于是在CentOS7最小化安装的操作系统环境安装SVN,我们首先排除一些环境因素.在此首先关闭了防火墙,安装了vim文本编辑工具.   2. 使用yum install -y subversi ...

  2. DNS域名解析服务的介绍

    1.1什么是域名? 域名(英语:Domain Name),简称域名.网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理 ...

  3. 【华为云技术分享】跟唐老师学习云网络 : Kubernetes网络实现

    当今K8s独霸天下之时,咱们站在更高的角度,好好的看看K8s网络是以什么理念构筑的.以及一个容器集群的好保姆,是如何分别照顾 南北流量和东西流量的. 一.简单介绍下Kubernetes 略..容器集群 ...

  4. 代码注入——c++代码注入

    代码注入之——c++代码注入 0x00  代码注入和DLL注入的区别 DLL注入后DLL会通过线程常驻在某个process中,而代码注入完成之后立即消失. 代码注入体积小,不占内存 0x01  通过c ...

  5. java IO流 (六) 其它的流的使用

    1. 标准的输入输出流:System.in:标准的输入流,默认从键盘输入System.out:标准的输出流,默认从控制台输出 修改默认的输入和输出行为:System类的setIn(InputStrea ...

  6. 京东秋招提前批初试--java开发工程师

    1,自我介绍,学过的课程有哪些 2,介绍一下java的内存结构和内存模型(jvm和jmm) 3,对于NIO有没有了解?作用是什么?(基于通道和缓冲区的I/O方式,用的是DirectByteBuffer ...

  7. sanri-tools-maven 企业软件开发工具集

    9420 开发工具包 sanri-tools-maven 是一个开源的用于企业开发的工具包,重点想解决项目开发中一些比较麻烦的问题 根据表和模板生成相应代码:一些身份证,企业代码,车架号的验证与生成: ...

  8. C、C++、Java到Python,编程入门学习什么语言好?

    摘要:回顾编程语言几十年来的兴衰起伏,似乎也折射了整个信息产业的变迁消亡,想要在技术的洪流里激流勇进,找准并学精一两门编程语言更加显得至关重要. 最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C ...

  9. Ethical Hacking - GAINING ACCESS(20)

    CLIENT SIDE ATTACKS - Spoofing backdoor extension Change the extension of the trojan from exe to a s ...

  10. 设计模式:chain of responsibility模式

    目的:弱化发出请求的对象和处理请求对象的之间的关系 理解:每个处理请求的对象仅仅只关注自己能处理的请求,不关系其他请求 优点: 无需一个管理类来匹配所有的请求,更灵活 责任链可以动态的调整 Andor ...