有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序随便搞...直接主席树或者离线后树状数组都可以。

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#define ll long long
#define ui unsigned int
#define ull unsigned long long
const int maxn=,mxnode=maxn*;
struct zs{int too,pre;}e[maxn];int tott,last[maxn];
int lc[mxnode],rc[mxnode],sm[mxnode],tt,rt[maxn];
int ch[maxn][],tot,pos[maxn],cnt,l[maxn],r[maxn],dl[maxn],fail[maxn];
int l1[maxn],r1[maxn],tim;
int i,j,k,n,m;
int L,R,P,SM;
char s[maxn]; int ra;char rx;
inline int read(){
rx=getchar(),ra=;
while(rx<''||rx>'')rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra;
} inline void insert(int a,int b){e[++tott].too=b,e[tott].pre=last[a],last[a]=tott;}
inline void trie(int n){
int p=,i,c;
for(i=;i<=n;i++){
c=s[i]-'a';
if(!ch[p][c])ch[p][c]=++tot,p=tot;else p=ch[p][c];
pos[++cnt]=p;
}
}
inline void getfail(){
int l=,r=,i,now,j,p;dl[]=;
while(l<r){
now=dl[++l];
for(i=;i<;i++)if(ch[now][i]){
dl[++r]=j=ch[now][i];
for(p=fail[now];p&&!ch[p][i];p=fail[p]);
fail[j]=!now?:ch[p][i],insert(fail[j],j);//printf(" %d - - ->%d\n",j,fail[j]);
}
}
} void dfs(int x){
l1[x]=++tim;
for(int i=last[x];i;i=e[i].pre)dfs(e[i].too);
r1[x]=tim;
} void insert(int &x,int pre,int a,int b){
sm[(x=++tt)]=sm[pre]+;
if(a==b)return;
int mid=a+b>>;
if(P<=mid)rc[x]=rc[pre],insert(lc[x],lc[pre],a,mid);
else lc[x]=lc[pre],insert(rc[x],rc[pre],mid+,b);
}
void query(int x,int pre,int a,int b){
if((L<=a&&R>=b)||!x){SM+=sm[x]-sm[pre];return;}
int mid=a+b>>;
if(L<=mid)query(lc[x],lc[pre],a,mid);
if(R>mid)query(rc[x],rc[pre],mid+,b);
} char ss[];int len;
inline void outx(int x){
if(!x){putchar('');return;}
while(x)ss[len++]=x%,x/=;
while(len)putchar(ss[--len]+);
}
int main(){
n=read(),m=read();
for(i=;i<=n;i++)
scanf("%s",s+),l[i]=cnt+,
trie(strlen(s+)),r[i]=cnt;
getfail();
dfs();tot++;
for(i=;i<=cnt;i++)//printf("i:%d dfn:%d\n",i,l1[pos[i]]),
P=l1[pos[i]],insert(rt[i],rt[i-],,tot); int x,y,kk;
while(m--)
x=read(),y=read(),kk=read(),
L=l1[pos[r[kk]]],R=r1[pos[r[kk]]],SM=,query(rt[r[y]],rt[l[x]-],,tot),
// printf(" %d-----%d\n",L,R),
printf("%d\n",SM);
}

[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. qml demo分析(externaldraganddrop-拖拽)

    一.效果展示 客户端程序拖拽是一个很常见的需求,对于QWidget程序来说,需要重写如图1这么几个方法,通过重写这几个方法的逻辑,我们就可以控制鼠标拖拽的逻辑,糟糕的是QDrag执行exec后是一个阻 ...

  2. node学习心得

    此次学习主要使用的是基于nodejs平台的web应用开发框架. 一.express的工程结构 1.bin/www:express的执行入口,存放可执行文件: 2.node_modules:存放pack ...

  3. HTML5学习知识点

    一.文档问题 1.html5新标签:section.header.footer.nav.aside.blockquote.q.fieldest.figure.address.article.detai ...

  4. linux mysql添加、删除用户、用户权限及mysql最大字段数量

    1.  登录: mysql -u username -p 显示全部的数据库: show databases; 使用某一个数据库: use databasename; 显示一个数据库的全部表: show ...

  5. cleanMyMac

    想看外国网站可以找我,facebook.youtube.XX大片等,只要8元钱,无限制用到服务器关闭.看大片流畅不成问题 需要cleanMyMac的请加微信只要10或直接拍 http://a.p6ff ...

  6. ThreadLocal 线程本地变量 及 源码分析

    ■ ThreadLocal 定义 ThreadLocal通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量 ...

  7. springBoot系列教程01:elasticsearch的集成及使用

    1.首先安装elasticsearch 集群环境,参考 http://www.cnblogs.com/xiaochangwei/p/8033773.html 注意:由于我的代码采用的是springbo ...

  8. Tengine 安装配置全过程(nginx 同理)

    1.安装必要的编译环境好 yum update yum install gcc gcc-c++ autoconf automake 2.安装需要的组件 A.PCRE PCRE(Perl Compati ...

  9. C#中DataGridView动态添加行及添加列的方法

    http://www.jb51.net/article/72259.htm Datagridview添加列: ? 1 2 3 4 5 DataGridViewTextBoxColumn acCode ...

  10. python中的if __name__=='__main__': main()解析

    python中我们会看到一段代码是这样的: if __name__=='__main__': main() 这段代码的什么意思,我们可以知道代码的意思是如果__name__=='__main__'为T ...