CF587F Duff is Mad
题目描述
题解:
有个$O(\sum 询问k串长)$的做法就不说了。
当然是过不去的。
貌似第22个点总长1e5只有三个串
所以考虑对询问的$k$串串长分开算。
先建$fail$树。
对于$s_k>=\sqrt{n}$的串,最多只有$\sqrt{n}$个。可以枚举然后$dfs$一遍,求出每个结束位置$fail$树子树内有多少个$s_k$的前缀。
然后用前缀和维护,对于每组询问$O(1)$出解。时间复杂度$O(n\sqrt{n})$。
对于$s_k<\sqrt{n}$的串,考虑用一遍$dfs$计算每个节点对经过他的串的贡献,用分块/树状数组维护前缀和。
代码:
#include<queue> #include<cmath> #include<vector> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef long long ll; const ll N = 100050; template<typename T> inline void read(T&x) {T f = 1,c = 0;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}x = f*c; } ll n,m,rt[N]; ll len[N]; char mp[N]; struct BIT {ll id[N];ll tag[N],s[350];void init(){for(ll i=1;i<=n;i++)id[i]=i/300+1;}void up(ll x,ll d){for(ll i=x;id[i]==id[x];i++)tag[i]+=d;for(ll i=id[x]+1;i<=id[n];i++)s[i]+=d;}ll down(ll x){return tag[x]+s[id[x]];} }bt; ll hed[N],cnt; struct EG {ll to,nxt; }e[N]; void ae(ll f,ll t) {e[++cnt].to = t;e[cnt].nxt = hed[f];hed[f] = cnt; } ll ans[N]; struct Q {ll l,r,id;Q(){}Q(ll l,ll r,ll i):l(l),r(r),id(i){} }; vector<Q>v3[N]; vector<ll>v1[N],v2[N]; struct Trie {ll tot,ch[N][26],fa[N],fl[N];void insert(ll l,ll k){ll u = 0;for(ll i=1;i<=l;i++){ll c = mp[i]-'a';if(!ch[u][c])ch[u][c]=++tot,fa[tot]=u;u = ch[u][c];if(l*l<=n)v1[u].push_back(k);}v2[u].push_back(k);rt[k] = u;}void build(){queue<ll>q;for(ll i=0;i<26;i++)if(ch[0][i]){q.push(ch[0][i]);ae(0,ch[0][i]);}while(!q.empty()){ll u = q.front();q.pop();for(ll i=0;i<26;i++){ll &v = ch[u][i];if(!v){v = ch[fl[u]][i];continue;}fl[v] = ch[fl[u]][i];ae(fl[v],v);q.push(v);}}} }tr; ll s[N],w[N]; void dfs1(ll u) {for(ll j=hed[u];j;j=e[j].nxt){ll to = e[j].to;dfs1(to);w[u]+=w[to];}for(ll i=0,lim=(ll)v2[u].size();i<lim;i++)s[v2[u][i]]=w[u]; } void sol1() {for(ll i=1;i<=n;i++)if(len[i]*len[i]>n){memset(s,0,sizeof(s));memset(w,0,sizeof(w));for(ll j=rt[i];j;j=tr.fa[j])w[j]=1;dfs1(0);for(ll j=1;j<=n;j++)s[j]+=s[j-1];for(ll j=0,lim=(ll)v3[i].size();j<lim;j++)ans[v3[i][j].id] = s[v3[i][j].r] - s[v3[i][j].l-1];} } void dfs2(ll u) {for(ll j=0,lim=(ll)v2[u].size();j<lim;j++)bt.up(v2[u][j],1);for(ll j=0,lim=(ll)v1[u].size();j<lim;j++){ll v = v1[u][j];for(ll i=0,lm=(ll)v3[v].size();i<lm;i++)ans[v3[v][i].id]+=bt.down(v3[v][i].r)-bt.down(v3[v][i].l-1);}for(ll j=hed[u];j;j=e[j].nxt)dfs2(e[j].to);for(ll j=0,lim=(ll)v2[u].size();j<lim;j++)bt.up(v2[u][j],-1); } int main() { // freopen("tt.in","r",stdin); read(n),read(m);bt.init();for(ll i=1;i<=n;i++){scanf("%s",mp+1);len[i] = strlen(mp+1);tr.insert(len[i],i);}tr.build();for(ll l,r,k,i=1;i<=m;i++){read(l),read(r),read(k);v3[k].push_back(Q(l,r,i));}sol1();dfs2(0);for(ll i=1;i<=m;i++)printf("%I64d\n",ans[i]);return 0; }
转载于:https://www.cnblogs.com/LiGuanlin1124/p/10723606.html
CF587F Duff is Mad相关推荐
- [CF587F]Duff is Mad[AC自动机+根号分治+分块]
题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...
- Best of Ruby Quiz 笔记之一:Mad Libs
我想读<Best of Ruby Quiz>并实践里面的内容是熟悉ruby的一个好方法,那么让我从今天开始,每天都用ruby来quiz一下. 几点说明:1.我是ru ...
- python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD)
python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD.Median Absolute Devi ...
- R语言dplyr包获取dataframe分组聚合汇总统计值实战(group_by() and summarize() ):均值、中位数、分位数、IQR、MAD、count、unique
R语言dplyr包获取dataframe分组聚合汇总统计值实战(group_by() and summarize() ):均值.中位数.分位数.IQR.MAD.count.unique 目录
- 机器学习数据预处理之离群值/异常值:MAD法(绝对值差中位数法)+绝对中位差(Median Absolute Deviation,MAD)
机器学习数据预处理之离群值/异常值:MAD法(绝对值差中位数法)+绝对中位差(Median Absolute Deviation,MAD) garbage in,garbage out. 异常值是分析 ...
- 机器学习数据清洗之异常数据处理、标准差法、MAD法、箱图法、图像对比法、异常值处理准则
机器学习数据清洗之异常数据处理.标准差法.MAD法.箱图法.图像对比法.异常值处理准则 目录
- 【教程】新手如何制作简单MAD和AMV,学不会那都是时辰
[教程]新手如何制作简单MAD和AMV,学不会那都是时 http://tieba.baidu.com/p/2303522172 [菜鸟教你做MAD]Vegas制作MAD入门教程 http://tieb ...
- 基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA算法
简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性算法( ...
- 达夫设备(Duff‘s Device)
一.简介 看到标题,大家也许知道我们要讲的内容是什么了.但是很多人可能又对这个达夫设备(Duff's Device)感到很陌生,这到底是什么东东啊?所谓的Duff's Device其实只是一种代码的特 ...
最新文章
- CountDownLatch的实现分析
- 排查 Node.js 服务内存泄漏,没想到竟是它?
- node.js path
- [新活动] 2015年推广返利活动
- python读取文件_python这么受欢迎,你知道如何以正确的方式来读取文件内容吗
- ACL初识(访问控制列表)
- 活动目录实战系列三(建立子域)
- 输入一个数,判断他是不是质数
- linux分配内核,linux 内核分配算法
- 网络协议栈深入分析(三)--BSD socket和传输层sock
- Java多线程编程(3)--线程安全性
- 力扣题目——118. 杨辉三角
- Ajax中async与cache参数
- ios更新了系统无服务器,苹果手机的iOS系统没法更新怎么办?
- 微型计算机的最少配是,只有SD卡大小的微型电脑 配Atom处理器
- python如何调整word表格宽度_python-docx编辑word表格
- ubuntu看不了bilibili视频
- ftp的20 21端口和主动被动模式
- 【管理心得之八】通过现象看本质,小王和小张谁更胜任?
- Mathematica中的绘图
热门文章
- 展讯camera去除尺寸相关缓存
- avrstudio5 拨码管
- win10 安装字体且不占用系统盘资源
- java中的权限修饰符_Java的权限修饰符的区别和用法总结
- 现代浏览器博物馆_云旅游!Tableau 为你揭秘纽约现代艺术博物馆的珍贵馆藏
- java php 单点登陆,cas实现单点登录,登出(java跟php客户端)(转)
- android sco通信,android – startBluetoothSco()在ICS上抛出安全异常(BROADCAST_STICKY)
- oracle中聚合比较函数,Oracle聚合函数/分析函数
- 计算相机采集帧率C实现
- 联科集团携手阿里云发布科研混合云平台 共建科研教育新生态