题目描述

题解:

有个$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相关推荐

  1. [CF587F]Duff is Mad[AC自动机+根号分治+分块]

    题意 给你 \(n\) 个串 \(s_{1\cdots n}\) ,每次询问给出 \(l,r,k\) ,问在 \(s_{l\cdots r}\) 中出现了多少次 \(s_k\) . \(n,q,\su ...

  2. Best of Ruby Quiz 笔记之一:Mad Libs

    我想读<Best of Ruby Quiz>并实践里面的内容是熟悉ruby的一个好方法,那么让我从今天开始,每天都用ruby来quiz一下.             几点说明:1.我是ru ...

  3. python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD)

    python使用statsmodels包中的robust.mad函数以及pandas的apply函数计算dataframe中所有数据列的中位数绝对偏差(MAD.Median Absolute Devi ...

  4. R语言dplyr包获取dataframe分组聚合汇总统计值实战(group_by() and summarize() ):均值、中位数、分位数、IQR、MAD、count、unique

    R语言dplyr包获取dataframe分组聚合汇总统计值实战(group_by() and summarize() ):均值.中位数.分位数.IQR.MAD.count.unique 目录

  5. 机器学习数据预处理之离群值/异常值:MAD法(绝对值差中位数法)+绝对中位差(Median Absolute Deviation,MAD)

    机器学习数据预处理之离群值/异常值:MAD法(绝对值差中位数法)+绝对中位差(Median Absolute Deviation,MAD) garbage in,garbage out. 异常值是分析 ...

  6. 机器学习数据清洗之异常数据处理、标准差法、MAD法、箱图法、图像对比法、异常值处理准则

    机器学习数据清洗之异常数据处理.标准差法.MAD法.箱图法.图像对比法.异常值处理准则 目录

  7. 【教程】新手如何制作简单MAD和AMV,学不会那都是时辰

    [教程]新手如何制作简单MAD和AMV,学不会那都是时 http://tieba.baidu.com/p/2303522172 [菜鸟教你做MAD]Vegas制作MAD入门教程 http://tieb ...

  8. 基于灰度的模板匹配算法(一):MAD、SAD、SSD、MSD、NCC、SSDA算法

    简介: 本文主要介绍几种基于灰度的图像匹配算法:平均绝对差算法(MAD).绝对误差和算法(SAD).误差平方和算法(SSD).平均误差平方和算法(MSD).归一化积相关算法(NCC).序贯相似性算法( ...

  9. 达夫设备(Duff‘s Device)

    一.简介 看到标题,大家也许知道我们要讲的内容是什么了.但是很多人可能又对这个达夫设备(Duff's Device)感到很陌生,这到底是什么东东啊?所谓的Duff's Device其实只是一种代码的特 ...

最新文章

  1. CountDownLatch的实现分析
  2. 排查 Node.js 服务内存泄漏,没想到竟是它?
  3. node.js path
  4. [新活动] 2015年推广返利活动
  5. python读取文件_python这么受欢迎,你知道如何以正确的方式来读取文件内容吗
  6. ACL初识(访问控制列表)
  7. 活动目录实战系列三(建立子域)
  8. 输入一个数,判断他是不是质数
  9. linux分配内核,linux 内核分配算法
  10. 网络协议栈深入分析(三)--BSD socket和传输层sock
  11. Java多线程编程(3)--线程安全性
  12. 力扣题目——118. 杨辉三角
  13. Ajax中async与cache参数
  14. ios更新了系统无服务器,苹果手机的iOS系统没法更新怎么办?
  15. 微型计算机的最少配是,只有SD卡大小的微型电脑 配Atom处理器
  16. python如何调整word表格宽度_python-docx编辑word表格
  17. ubuntu看不了bilibili视频
  18. ftp的20 21端口和主动被动模式
  19. 【管理心得之八】通过现象看本质,小王和小张谁更胜任?
  20. Mathematica中的绘图

热门文章

  1. 展讯camera去除尺寸相关缓存
  2. avrstudio5 拨码管
  3. win10 安装字体且不占用系统盘资源
  4. java中的权限修饰符_Java的权限修饰符的区别和用法总结
  5. 现代浏览器博物馆_云旅游!Tableau 为你揭秘纽约现代艺术博物馆的珍贵馆藏
  6. java php 单点登陆,cas实现单点登录,登出(java跟php客户端)(转)
  7. android sco通信,android – startBluetoothSco()在ICS上抛出安全异常(BROADCAST_STICKY)
  8. oracle中聚合比较函数,Oracle聚合函数/分析函数
  9. 计算相机采集帧率C实现
  10. 联科集团携手阿里云发布科研混合云平台 共建科研教育新生态