有n只熊,从1到n进行编号。

  第i只熊的电话号码是si。每只熊会给那些电话号码是他的子串的熊打电话(可能会给自己打)。

  call(i, j) 表示第i只熊给第j只熊打电话的次数,也就是第j个串在第i个串中出现的次数。

  迈克会有q次询问。每个询问中给出L,R,k,然后请您计算一下 sum{call(i,k)},L<=i<=R
 Input
  第一行包含两个整数n 和 q (1 ≤ n ≤ 2 × 10^5 , 1 ≤ q ≤ 5 × 10^5).
  接下来n行,每行一个电话号码,第i行给出第i只熊的电话号码。每个号码只包含英文小写字符,并且非空,所有串的长度之和≤ 2 × 10^5
  接下来q行,每行包含l,r,k(1 ≤ l ≤ r ≤ n 并且 1 ≤ k ≤ n)。

 Output
  对于每一个查询,输出答案并换行。

  根据fail链建树,每次的查询变成统计 第l..r个字符串的所有前缀的结束节点 有多少个是在 查询串的结束节点的子树里。

  按dfs序随便搞...直接主席树或者离线后树状数组都可以。

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<queue>
  6. #include<cmath>
  7. #define ll long long
  8. #define ui unsigned int
  9. #define ull unsigned long long
  10. const int maxn=,mxnode=maxn*;
  11. struct zs{int too,pre;}e[maxn];int tott,last[maxn];
  12. int lc[mxnode],rc[mxnode],sm[mxnode],tt,rt[maxn];
  13. int ch[maxn][],tot,pos[maxn],cnt,l[maxn],r[maxn],dl[maxn],fail[maxn];
  14. int l1[maxn],r1[maxn],tim;
  15. int i,j,k,n,m;
  16. int L,R,P,SM;
  17. char s[maxn];
  18.  
  19. int ra;char rx;
  20. inline int read(){
  21. rx=getchar(),ra=;
  22. while(rx<''||rx>'')rx=getchar();
  23. while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra;
  24. }
  25.  
  26. inline void insert(int a,int b){e[++tott].too=b,e[tott].pre=last[a],last[a]=tott;}
  27. inline void trie(int n){
  28. int p=,i,c;
  29. for(i=;i<=n;i++){
  30. c=s[i]-'a';
  31. if(!ch[p][c])ch[p][c]=++tot,p=tot;else p=ch[p][c];
  32. pos[++cnt]=p;
  33. }
  34. }
  35. inline void getfail(){
  36. int l=,r=,i,now,j,p;dl[]=;
  37. while(l<r){
  38. now=dl[++l];
  39. for(i=;i<;i++)if(ch[now][i]){
  40. dl[++r]=j=ch[now][i];
  41. for(p=fail[now];p&&!ch[p][i];p=fail[p]);
  42. fail[j]=!now?:ch[p][i],insert(fail[j],j);//printf(" %d - - ->%d\n",j,fail[j]);
  43. }
  44. }
  45. }
  46.  
  47. void dfs(int x){
  48. l1[x]=++tim;
  49. for(int i=last[x];i;i=e[i].pre)dfs(e[i].too);
  50. r1[x]=tim;
  51. }
  52.  
  53. void insert(int &x,int pre,int a,int b){
  54. sm[(x=++tt)]=sm[pre]+;
  55. if(a==b)return;
  56. int mid=a+b>>;
  57. if(P<=mid)rc[x]=rc[pre],insert(lc[x],lc[pre],a,mid);
  58. else lc[x]=lc[pre],insert(rc[x],rc[pre],mid+,b);
  59. }
  60. void query(int x,int pre,int a,int b){
  61. if((L<=a&&R>=b)||!x){SM+=sm[x]-sm[pre];return;}
  62. int mid=a+b>>;
  63. if(L<=mid)query(lc[x],lc[pre],a,mid);
  64. if(R>mid)query(rc[x],rc[pre],mid+,b);
  65. }
  66.  
  67. char ss[];int len;
  68. inline void outx(int x){
  69. if(!x){putchar('');return;}
  70. while(x)ss[len++]=x%,x/=;
  71. while(len)putchar(ss[--len]+);
  72. }
  73. int main(){
  74. n=read(),m=read();
  75. for(i=;i<=n;i++)
  76. scanf("%s",s+),l[i]=cnt+,
  77. trie(strlen(s+)),r[i]=cnt;
  78. getfail();
  79. dfs();tot++;
  80. for(i=;i<=cnt;i++)//printf("i:%d dfn:%d\n",i,l1[pos[i]]),
  81. P=l1[pos[i]],insert(rt[i],rt[i-],,tot);
  82.  
  83. int x,y,kk;
  84. while(m--)
  85. x=read(),y=read(),kk=read(),
  86. L=l1[pos[r[kk]]],R=r1[pos[r[kk]]],SM=,query(rt[r[y]],rt[l[x]-],,tot),
  87. // printf(" %d-----%d\n",L,R),
  88. printf("%d\n",SM);
  89. }

[51nod1440]迈克打电话的更多相关文章

  1. iOS开发之调用系统打电话发短信接口以及程序内发短信

    在本篇博客开头呢,先说一下写本篇的博客的原因吧.目前在做一个小项目,要用到在本应用程序内发验证码给其他用户,怎么在应用内发送短信的具体细节想不大起来了,于是就百度了一下,发现也有关于这方面的博客,点进 ...

  2. Android开发学习——打电话应用

    打电话应用 system/app/phone.apk  这个是打电话应用,这个Java API 不允许应用级程序员改写,系统级才可以 system/app/dialer.apk  这个是拨号器应用,可 ...

  3. 打电话,发短信,发邮件,app跳转

    1.打电话 - (IBAction)callPhone1:(id)sender { NSURL *url = [NSURL URLWithString:@"tel://18500441739 ...

  4. addChildViewController后开启热点/wifi/打电话引起的子vc的布局问题

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Menlo; color: #00b1ff } p.p2 { margin: 0.0px 0. ...

  5. iOS 打电话 发短信(转载)

    官方代码 发短息和邮件添加MessageUI.framework 库 发送信息 - (IBAction)showSMSPicker:(id)sender { // You must check tha ...

  6. linux下利用GPRS模块发短信、打电话

    一.开发环境     内核版本:linux-3.0    开发板:FL2440(nandflash:K9F1G08 128M)    GPRS模块:SIM900   二.与发短信和拨号相关的 AT 指 ...

  7. iOS中如何切换到发短信、打电话、发邮件

    我们在做APP的时候,难免会遇到需要调用短信,电话等程序的时候.如美团. 当然,这些都只是一些简单的方法就可以实现,但是时间久了也会淡忘,所以想写这边博客.一是为了再捡起来复习一下,另一个相当于留个备 ...

  8. iOS开发中打电话发短信等功能的实现

    在APP开发中,可能会涉及到打电话.发短信.发邮件等功能.比如说,通常一个产品的"关于"页面,会有开发者的联系方式,理想情况下,当用户点击该电话号码时,能够自动的帮用户拨出去,就涉 ...

  9. ios 设置亮度、声音;调用发短信、邮件、打电话

    一,设置亮度 [[UIScreen mainScreen] setBrightness:0.5];//0.0~1.0 二,设置声音 1,添加 MediaPlayer.framework 框架 2,在需 ...

随机推荐

  1. mongodb 复制集

    mongodb 复制集 复制集简介 Mongodb复制集由一组Mongod实例(进程)组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写 ...

  2. Python学习日记:day1

    1.计算机基础 cpu:相当于人的大脑,用于计算. 内存:储存数据,运行速度快,成本高,断电数据消失. 硬盘 :固态硬盘(快).机械硬盘(有指针).储存数据,需要长期保持数据,重要文件 打开qq过程: ...

  3. 百度云BCC配置Apache VirtualHost 实现相同域名不同端口访问不同应用

    问题描述:前戏:本人在百度云上购买了BCC虚拟服务,并购买域名,部署应用,可以正常访问(这里一切都很正常^_^). 事情正在起变化:随着开发的不断推进,工程在本地测试成功后,部署到服务器,会发现有些页 ...

  4. Java I/O---序列化接口Serializable

    1.JDK API 中关于Serializable的描述 public interface Serializable 类通过实现 java.io.Serializable 接口以启用其序列化功能.未实 ...

  5. bzoj 4898: [Apio2017]商旅

    Description 在广阔的澳大利亚内陆地区长途跋涉后,你孤身一人带着一个背包来到了科巴.你被这个城市发达而美丽的市场所 深深吸引,决定定居于此,做一个商人.科巴有个集市,集市用从1到N的整数编号 ...

  6. 添加MD5 密码加密

        编辑 /etc/grub/grub.conf 配置文件 password = 123456 password --md5 $5$H.........SS grub-crypt  --md5   ...

  7. Illustration of Git branching and merge

    网上看到的描述Git工作流程的图片,有些出处忘了保存,仅供学习. 1. One Git Branching Model 出处: http://nvie.com/posts/a-successful-g ...

  8. linux socket编程:简易客户端与服务端

    什么是socket? socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开open –> 读写write/read –> 关闭close”模式来 ...

  9. 一秒搞定mysql的远程登录

    执行下面命令! mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'mypw' WITH GRANT OPTION ; ...

  10. JDK1.8中的线程池

    上面这段代码一直在用,面试的时候也经常被问到,却从未深究过,不知道线程池到底是怎么回事,今天看看源代码,一探其究竟 线程池主要控制的状态是ctl,它是一个原子的整数,其包含两个概念字段: worker ...