题目:

新日暮里中,比冲是一位博学的哲学教授。由于最近要帮学生准备考试,他决定弄个提纲给学生。然而同事van不服气,觉得这样学生就没有了自我思考,便在提纲中添加废话。
比冲很无奈,他想找回原稿。我们把现在的提纲看成是一个字符串S。他知道van只会在原稿结尾添加语句,也就是说,原稿是S的前缀。
现在比冲有m个询问,以此来找出原稿。每次给出两个位置l,r,问以l与r结尾的字符串中,有多少个字符串符合原稿的性质,最长的有多长。

样例输入:
第一行一个只包含小写字母的字符串S,代表被改过的提纲。注意字符串从1开始编号。
第二行一个正整数m,即询问数。
接下来m行,每行两个正整数l,r,即位置。
ababbaabbaababab
3
14 16
3 6
2 4

样例输出:
2 4
1 1
1 2

数据范围:
30%:|S|<=300;m<=300
60%: |S|<=3000;m<=100000
100%:|S|<=30000;m<=100000

剖解题目:

给一个字符串,分别求出符合这三个条件的子串:
1.该子串是该字符串的前缀。
2.该子串是以l为结尾的1~l的子串的后缀。
3.该子串是以r为结尾的1~r的子串的后缀。
求出符合这三个条件的子串的数量以及子串的最大长度。


思路:

关系到了一个字符串的公共前后缀的问题,自然要往“看毛片(KMP)”的方面去想。


解法:

30%:暴力,时间 n3 n^3.
60%:可以想到运用“看毛片”的next数组,该提转化成:对于l,r两个位置,他们沿着next数组往前跳要跳几次才重合,并且重合后还能够往前跳几次,暴力统计即可。
100%:发现跳的规律,自然而然可以把next数组中,next[i]看做是i的父亲,然后就构建了一棵树,接下来求Lca以及Lca的深度,运用离线Tarjan,倍增,树上RMQ即可。时间复杂度: O(n) O(n)or O(nlogn) O(n log n).


代码(倍增):

#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define down(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int maxn=30005,M=32;
int a[maxn],tree[maxn],up[maxn][M],m,next[maxn],deep[maxn],dad[maxn];
char s[maxn];void dfs(int x)
{if (!x) return;if (dad[x]==-1){dad[x]=next[x];up[x][0]=dad[x];dfs(dad[x]);deep[x]=deep[dad[x]]+1;fo(i,1,M) //这里遇到奇怪现象,当i=M时,up[x-1][i]莫名被赋值了,不懂-_-|||up[x][i]=up[up[x][i-1]][i-1];}
}
int getlca(int x,int y)
{if (deep[x]<deep[y]) swap(x,y);down(i,M-1,0)if (deep[y]<=deep[up[x][i]]) x=up[x][i];if (x==y) return x;down(i,M-1,0)if (up[x][i]!=up[y][i]) {x=up[x][i];y=up[y][i];}return up[x][0];
}
int main()
{freopen("T2.in","r",stdin);freopen("T2.out","w",stdout);scanf("%s",&s);int n=strlen(s);fo(i,0,n-1) a[i+1]=s[i];int j=0;fo(i,2,n){while (j!=0 && a[j+1]!=a[i]) j=next[j];if (a[j+1]==a[i]) ++j;next[i]=j;}memset(dad,255,sizeof(dad));dad[0]=0;fo(i,1,n) dfs(i);scanf("%d",&m);fo(i,1,m){int l,r;scanf("%d%d",&l,&r);if (l==r) {int ans=1;while (next[l]) {++ans;l=next[l];}printf("%d %d\n",ans,r);continue;}int lca=getlca(l,r);printf("%d %d\n",deep[lca],lca);}fclose(stdin); fclose(stdout);
}

弄提纲【NOIP2016提高A组模拟7.19】相关推荐

  1. 4668. 【NOIP2016提高A组模拟7.19】腐败

    Description Input 第一行一个正整数n,表示序列长度 第二行n个正整数,为给出的序列A Output 一个非负整数,为答案. Sample Input 3 6 4 12 Sample ...

  2. jzoj4669-[NOIP2016提高A组模拟7.19]弄提纲【LCA,KMP,字符串】

    正题 题目大意 一个字符串SSS,给出若干个l,rl,rl,r 求SSS以lll和rrr结尾的前缀一个公共后缀且它是SSS的前缀的子串. 求有多少和最长的那个的长度 解题思路 首先后缀前缀很容易想到K ...

  3. JZOJ 100024. 【NOIP2016提高A组模拟7.6】数球

    Description 小A有n个球,编号分别为1到n,小A每次都会从n个球中取出若干个球,至少取一个,至多取n个,每次取完再放回去,需要满足以下两个条件. 每次取出的球的个数两两不同. 每次取出的球 ...

  4. JZOJ4708. 【NOIP2016提高A组模拟8.20】奇洛金卡达 倒着做的思想+并查集维护

    题目大意 给定一个长度小于等于kk的字符串和qq,表示现在有qq个操作,每个操作给定两个参数li,ril_i,r_i表示把现在的字符串第lil_i到rir_i把其中编号为奇数的按顺序写下来,再在后面把 ...

  5. 树上摩托【NOIP2016提高A组模拟9.4】

    题目 Sherco是一位经验丰富的魔♂法师. Sherco在第零次圣杯战争中取得了胜利,并取得了王之宝藏--王の树. 他想把这棵树砍去任意条边,拆成若干棵新树,并装饰在他的摩托上,让他的摩托更加酷炫. ...

  6. 【NOIP2016提高A组模拟9.9】闭门造车

    题目 自从htn体验了一把飙车的快感,他就下定决心要闭门造车!但是他两手空空怎么造得出车来呢?无奈的他只好来到了汽车零部件商店. 一走进商店,玲琅满目的各式零件看得htn眼花缭乱.但是他很快便反应过来 ...

  7. [JZOJ4788] 【NOIP2016提高A组模拟9.17】序列

    题目 描述 题目大意 一个序列,每次可以使一段区间内的所有数加一(模四). 问最少的操作次数. 思考历程 一看这题目,诶,这不就是那道叫密码锁的题目吗? 然后随便打一打,样例过了,就再也没有思考这一题 ...

  8. JZOJ 4726. 【NOIP2016提高A组模拟8.22】种花

    Description 经过三十多个小时的长途跋涉,小Z和小D终于到了NOI现场--南山南中学.一进校园,小D就被花所吸引了(不要问我为什么),遍和一旁的种花园丁交(J)流(L)了起来. 他发现花的摆 ...

  9. JZOJ 4676. 【NOIP2016提高A组模拟7.21】模板串

    Description 科学家温斯顿从数据库中找到了一串相当长的字符串. 他正试图用一个模板串来重构这个字符串. 他可以将模板串复制多份,通过合适的方式拼接起来,使得最终的串与原串一致. 如果两个模板 ...

最新文章

  1. Redis的高级特性哨兵
  2. springmvc二十二:annotation-driven标签
  3. day10 局部变量 全局变量 作用域前奏
  4. asp.net+mysq 数据库操作类
  5. android 更新平台,Android更新平台架构方案
  6. java中随机数边界问题,java 简单Dice问题(随机数的运用)
  7. 栈溢出笔记1.8 字符串问题
  8. AngularJS之代码风格36条建议【一】(九)
  9. library/adodb/adodb.inc.php,ADOdb Library for PHP
  10. python图像标记工具怎么用_图像标注教程(使用LabelImg标注工具)
  11. java中的递归算法_java递归实现
  12. 排列组合c几几怎么用计算机算,排列组合A几几C几几的,有什么区别,都怎么计算来的?...
  13. MapReduce系列之MapReduce的输出
  14. 26岁学编程会不会已经晚了?
  15. jdbc连接数据库7个步骤
  16. cout的格式控制——关于cout.width()和cout.fill()
  17. 爱码哥移动开发平台的4大开发环境
  18. 哈尔滨师范大学计算机科学与信息工程学院,计算机科学与信息工程学院邀殷明浩教授举办学术讲座...
  19. 关于Oracle闪回机制知识点
  20. 计算机控制技术长安大学汽车学院,长安大学汽车学院研究生导师简介-高杨

热门文章

  1. mysql 删除slave_如何彻底清除从库(slave)设置
  2. 微信公众号之支付验证签名失败
  3. 用专业的说一句情话 计算机,学计算机的说一句情话
  4. matlab 层次聚类算法,层次聚类的Matlab实现代码
  5. (摘录)英语学习方法
  6. 室内不能摆的52种致癌植物
  7. button按钮的属性设置_web前端入门到实战:CSS实现8种炫酷按钮
  8. (全国)废旧石膏基墙板技术与设备开发中心揭牌
  9. 解决 “chrome 正受到自动测试软件的控制” 的提示
  10. C语言:汉诺塔(经典递归问题)