• 题解

    • 对$S$集合ac建自动机,把$T_{i}$放在里面跑,记录路径上的所有节点并对它们在fail树上求到root的树链并;
    • 这样就得到了$T_{i}$所有的子串;
    • 动态将$T_{i}$加入直接用树状数组维护子树和即可;
    • 另见:喵星球上的点名的ac自动机解法
    •  #include<bits/stdc++.h>
      #define rg register
      #define il inline
      using namespace std;
      const int N=;
      int n,m,cnt,ch[N][],fl[N],fa[N],head,tail,que[N],o=,hd[N],sz[N];
      int tp[N],dep[N],idx,st[N],ed[N],c[N],vis[N],id[N],tmp[N],tot,tt;
      char s[N];
      struct Edge{int v,nt;}E[N];
      il void adde(int u,int v){E[o]=(Edge){v,hd[u]};hd[u]=o++;}
      il char gc(){
      static char*p1,*p2,S[];
      if(p1==p2)p2=(p1=S)+fread(S,,,stdin);
      return(p1==p2)?EOF:*p1++;
      }
      il int rd(){
      int x=; char C=gc();
      while(C<''||C>'')C=gc();
      while(C>=''&&C<='')x=(x<<)+(x<<)+C-'',C=gc();
      return x;
      }
      il int gt(){
      char *p=s,C=gc();
      while(!isalpha(C))C=gc();
      while(isalpha(C))*p++=C,C=gc();
      return p - s;
      }
      il bool cmp(const int&a,const int&b){return st[a]<st[b];}
      il void ins(int now,int len){
      int u=,x;
      for(int i=;i<len;i++){
      if(!ch[u][x=s[i]-'a'])ch[u][x]=++cnt;
      u=ch[u][x];
      }
      sz[id[now]=u]=vis[u]=;
      }
      void get_fl(){
      head=tail=;
      for(rg int i=;i<;i++)if(ch[][i]){
      que[++tail]=ch[][i];
      if(vis[ch[][i]])adde(,ch[][i]);
      }
      while(head<tail){
      int u=que[++head];
      for(rg int i=;i<;i++){
      int&v=ch[u][i];
      if(!v){v=ch[fl[u]][i];continue;}
      fl[v]=ch[fl[u]][i];
      if(vis[fl[v]])fa[v]=fl[v];
      else fa[v]=fa[fl[v]];
      if(vis[v])adde(fa[v],v);
      que[++tail]=v;
      }
      }
      for(int i=tail;i;i--)if(vis[que[i]])sz[fa[que[i]]]+=sz[que[i]];
      }
      il void dfs(int u,int T){
      st[u]=++idx;tp[u]=T;
      dep[u]=dep[fa[u]]+;
      int mx=-,son=;
      for(rg int i=hd[u];i;i=E[i].nt){if(sz[E[i].v]>mx)mx=sz[son=E[i].v];}
      if(son)dfs(son,T);
      for(rg int i=hd[u];i;i=E[i].nt){if(E[i].v!=son)dfs(E[i].v,E[i].v);}
      ed[u]=idx;
      }
      il void add(int x,int y){if(!x)return;for(;x<=idx;x+=x&-x)c[x]+=y;}
      il int ask(int x){int re=;for(;x;x-=x&-x)re+=c[x];return re;}
      il int lca(int u,int v){
      int tu=tp[u],tv=tp[v];
      while(tu!=tv){
      if(dep[tu]<dep[tv])v=fa[tv],tv=tp[v];
      else u=fa[tu],tu=tp[u];
      }
      return dep[u]<dep[v]?u:v;
      }
      void update(int len){
      tt=tot=;
      for(rg int i=,u=;i<len;i++){
      u=ch[u][s[i]-'a'];
      if(vis[u])tmp[++tt]=u;
      else if(fa[u])tmp[++tt]=fa[u];
      }
      if(!tt)return;
      sort(tmp+,tmp+tt+,cmp);
      tot=;
      for(rg int i=;i<=tt;i++){
      tot+=st[tmp[i]]>ed[tmp[tot]];
      tmp[tot]=tmp[i];
      }
      add(st[tmp[]],);
      for(rg int i=;i<=tot;i++){
      add(st[lca(tmp[i],tmp[i-])],-);
      add(st[tmp[i]],);
      }
      }
      int main(){
      #ifndef ONLINE_JUDGE
      freopen("bzoj3881.in","r",stdin);
      freopen("bzoj3881.out","w",stdout);
      #endif
      n=rd();
      for(rg int i=;i<=n;i++){ins(i,gt());}
      get_fl();
      dfs(,);
      m=rd();
      for(rg int i=,x,y;i<=m;i++){
      x=rd();
      if(x==)update(gt());
      else y=rd(),printf("%d\n",ask(ed[id[y]])-ask(st[id[y]]-));
      }
      return ;
      }

      bzoj3881

【bzoj3881】【Coci2015】Divljak的更多相关文章

  1. 【BZOJ3881】[Coci2015]Divljak fail树+树链的并

    [BZOJ3881][Coci2015]Divljak Description Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操 ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  3. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  4. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  5. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  6. 【Win 10 应用开发】应用预启动

    所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...

  7. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  8. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  9. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  10. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

随机推荐

  1. 吴恩达 Deep learning 第二周 神经网络基础

    逻辑回归代价函数(损失函数)的几个求导特性 1.对于sigmoid函数 2.对于以下函数 3.线性回归与逻辑回归的神经网络图表示 利用Numpy向量化运算与for循环运算的显著差距 import nu ...

  2. 阿里云ubuntu16.04安装beef

    0x0 前言 环境:阿里云轻量服务器ubuntu16.04 需要安装2.4以上版本的ruby:https://www.cnblogs.com/Rain99-/p/10666247.html 参考资料 ...

  3. 升级salt导致进程kill问题记录

    重启salt-minion导致由salt启动的进程kill问题排查 作者:耀耀 blog:https://www.liuyao.me 环境 服务器系统为centos6及centos7 服务器服务进程都 ...

  4. 第十二次ScrumMeeting博客

    第十二次ScrumMeeting博客 本次会议于11月30日(四)22时整在3公寓725房间召开,持续35分钟. 与会人员:刘畅.辛德泰.张安澜.赵奕.方科栋. 1. 每个人的工作(有Issue的内容 ...

  5. JVM新生代老年代详解

    1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...

  6. OO第一阶段作业总结

    对于OO这门课,学长学姐偶尔提起,大家都略有耳闻,但是并没有将其和计组相提并论.因此,在刚开始接触的时候,并不认为其会比计组难到哪里去,然而事实证明,还是不要想当然去判断,以及不提前学好JAVA对于O ...

  7. 任务看板-Monday

    工作照

  8. 第二阶段Sprint冲刺会议2

     进展:讨论主界面布局,跳转界面的布局,查看有关页面跳转的资料及示例代码并试着编写. 

  9. “吃神么,买神么”的第一个Sprint计划(第四天)

    “吃神么,买神么”项目Sprint计划 ——5.24  星期日(第四天)立会内容与进度 摘要:logo做出来了,但是在立会展示时遭到反对,不合格,重新设计.(附上失败的logo图) 目前搜索栏出来了, ...

  10. 微服务负载均衡 —— ribbon

    负载均衡是系统高可用.缓解网络流量和处理能力扩容的重要手段,广义的负载均衡指的是服务端负载均衡,如硬件负载均衡(F5)和软件负载均衡(Nginx).负载均衡设备会维护一份可用的服务器的信息,当客户端请 ...