loj6070【山东集训第一轮Day4】基因


题解:- 分块对每个块的起点$st[i]$到$n$做一次回文自动机;
- 由于子串的回文自动机是原串的子图,所以并不需要重新构图,在原来的图上做即可;
- 做的时候记录某个终点的本质不同的回文串和$sum[i][r]$
- 对于询问$[l,r]$,直接统计$l$后的整块,考虑统计$l$所在的散块$[l,st[i]]$
- 根据回文串的对称性,可以预处理出在$st[i]$匹配的最长回文后缀节点,所以从st[i]到l暴力即可;
- 注意判断是否重复和是否超出边界;
- 暂时还不会两个log的做法;
#include<bits/stdc++.h>
#define rg register
using namespace std;
const int M=,N=;
int T,n,m,typ,sz,ch[N][],Fl[N][],fl[N],end[M][N],pos[M][N];
int sum[M][N],u,tot,bl[N],st[N],ed[N],lst,vis[N],len[N],s[N];
inline char gc(){
static char*p1,*p2,buf[];
if(p1==p2)p2=(p1=buf)+fread(buf,,,stdin);
return(p1==p2)?EOF:*p1++;
}
inline int rd(){
int x=;char c=gc();
while(c<''||c>'')c=gc();
while(c>=''&&c<='')x=(x<<)+(x<<)+c-'',c=gc();
return x;
}
void extend1(int l,int i){
int x=lst;
if(i-len[x]-<l||s[i-len[x]-]!=s[i])x=Fl[x][s[i]];
if(!ch[x][s[i]]){
len[++sz]=len[x]+;
int y=fl[x];
if(s[i-len[y]-]!=s[i])y=Fl[y][s[i]];y=ch[y][s[i]];
memcpy(Fl[sz],Fl[y],sizeof(Fl[y]));
Fl[sz][s[i-len[y]]]=fl[sz]=y;
ch[x][s[i]]=sz;
}
lst=x=ch[x][s[i]];
}
void extend2(int i,int r){
int x=lst;
if(i+len[x]+>r||s[i+len[x]+]!=s[i])x=Fl[x][s[i]];
if(!ch[x][s[i]]){
len[++sz]=len[x]+;
int y=fl[x];
if(s[i+len[y]+]!=s[i])y=Fl[y][s[i]];y=ch[y][s[i]];
memcpy(Fl[sz],Fl[y],sizeof(Fl[y]));
Fl[sz][s[i+len[y]]]=fl[sz]=y;
ch[x][s[i]]=sz;
}
lst=x=ch[x][s[i]];
}
int main(){
#ifndef ONLINE_JUDGE
freopen("loj6070.in","r",stdin);
freopen("loj6070.out","w",stdout);
#endif
typ=rd();n=rd();m=rd();
u = sqrt(n);
char c=gc();while(!isalpha(c))c=gc();
for(int i=;i<=n;++i,c=gc()){
bl[i]=(i-)/u+;ed[bl[i]]=i;
if(!st[bl[i]])st[bl[i]]=i;
s[i]=c-'a';
}tot=bl[n];
sz=;
fl[]=;fl[]=;
len[]=;len[]=-;
for(rg int i=;i<;++i)Fl[][i]=;
memset(end,0x3f,sizeof(end));
for(rg int i=;i<=tot;++i){
lst=;T++;
for(rg int j=st[i];j<=n;++j){
extend1(st[i],j);
sum[i][j]=sum[i][j-];
if(vis[lst]<T){
vis[lst]=T;
sum[i][j]++;
end[i][lst]=j;
}
if(len[lst]==j-st[i]+)pos[i][j]=lst;
else pos[i][j]=pos[i][j-];
}
}
int ans=;
for(rg int i=,l,r;i<=m;++i){
T++;
l=rd();r=rd();
if(typ)l^=ans,r^=ans;
if(bl[l]==bl[r]){
lst=;ans=;
for(rg int j=l;j<=r;++j){
extend1(l,j);
if(vis[lst]<T)vis[lst]=T,ans++;
}
}else{
ans=sum[bl[l]+][r];
lst=pos[bl[l]+][r];
for(rg int j=ed[bl[l]];j>=l;--j){
extend2(j,r);
if(vis[lst]<T&&end[bl[l]+][lst]>r)vis[lst]=T,ans++;
}
}
printf("%d\n",ans);
}
return ;
}loj6070
loj6070【山东集训第一轮Day4】基因的更多相关文章
- 【考试记录】2018 山东省队集训第一轮D4(雾)
T1题意: 给你一个$n\times m$的矩阵$B$,求它能由最少多少个形如两个向量之积$(n\times 1)\times(1\times m)$的矩阵相加得到. 题解: 考虑上界,最多需要$mi ...
- 上海市2019年公务员录用考试第一轮首批面试名单(B类)
上海市2019年公务员录用考试第一轮首批面试名单(B类) 2019-03-12 设置字体:大 中 小 职位序号 注册编号 职位序号 注册编号 职位序号 注册编号 职位序号 注册编号 1910565 5 ...
- 上海市2019年公务员录用考试第一轮首批面试名单(A类)
上海市2019年公务员录用考试第一轮首批面试名单(A类) 注册编号 总成绩 注册编号 总成绩 注册编号 总成绩 注册编号 总成绩 4016574 127.4 5112479 145.9 5125732 ...
- 玩下软工项目,第一轮--全局Context的获取,SQLite的建立与增删改查,读取用户通话记录信息
项目的Github地址:https://github.com/ggrcwxh/LastTime 采用基于git的多人协作开发模式 软件采用mvc设计模式,前端这么艺术的事我不太懂,交给斌豪同学去头疼了 ...
- STL 入门 (17 暑假集训第一周)
快速全排列的函数 头文件<algorithm> next_permutation(a,a+n) ---------------------------------------------- ...
- Postmortem Report 第一轮迭代事后分析报告
一.设想和目标 1.1 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件<BlueZ>是一款全新动作类塔防游戏.与市面上已经存在的塔防游戏不同 ...
- SDOI2017第一轮
本蒟蒻表示终于$AC$了$SDOI2017\text{第一轮}$! 兴奋! 附上各个题的题解: $DAT1$: $T1$: BZOJ4816: [Sdoi2017]数字表格 $T2$: BZOJ481 ...
- 史上最全的CSP-J/S 第一轮知识点
CSP-J/S 第一轮知识点选讲 \(NOIP\)(全国青少年信息学奥林匹克竞赛)于2019年取消.取而代之的是由\(CCF\)推出的非专业级软件能力认证,也就是现在的\(CSP-J/S\).作为一名 ...
- it's over | 2019 CSP-S 第一轮认证
不知道自己有没有凉,毕竟我们省这么弱(据说有的省80都悬... 其实这几天对初赛基本没什么感觉,可能是没给自己多大压力吧,倒是班上的一群同学似乎比我们还着急,我们的数学课代表兼数竞大佬特意给我画了吉祥 ...
随机推荐
- (转)Django配置数据库读写分离
转:https://blog.csdn.net/Ayhan_huang/article/details/78784486 转:http://www.cnblogs.com/dreamer-fish/p ...
- Django_信号
目录 Django信号介绍 Django内置信号 信号种类 信号注册 自定义信号 实测 内置信号 自定义信号 Django信号介绍 Django中提供了“信号调度”,用于在框架执行操作时解耦.通俗来讲 ...
- HDU 1556 Color the ball (一维树状数组,区间更新,单点查询)
中文题,题意就不说了 一开始接触树状数组时,只知道“单点更新,区间求和”的功能,没想到还有“区间更新,单点查询”的作用. 树状数组有两种用途(以一维树状数组举例): 1.单点更新,区间查询(即求和) ...
- Servlet各版本web.xml的头文件配置模板
原文: http://www.codeweblog.com/servlet%E5%90%84%E7%89%88%E6%9C%ACweb-xml%E7%9A%84%E5%A4%B4%E6%96%87%E ...
- console.log() 替代函数
var log = console.log.bind(console); log('d')
- 20135231 JAVA实验报告三:敏捷开发与XP实践
---恢复内容开始--- JAVA实验报告三:敏捷开发与XP实践 20135231 何佳 实验内容 1. XP基础 2. XP核心实践 3. 相关工具 实验要求 1.没有Linux基础的同学建议先学习 ...
- iOS开发学习-资源打包
图片是被放到Images.xcassets中 1.部署版本在>=iOS8的时候,打包的资源包中的图片会被放到Assets.car 图片被压缩: 2.部署版本在<iOS8的时候,打包的资源包 ...
- Leetcode题库——8.字符串转为整数【##】
@author: ZZQ @software: PyCharm @file: myAtoi.py @time: 2018/9/20 20:54 要求:实现 atoi,将字符串转为整数. 1)根据需要丢 ...
- DPDK skeleton basicfwd 源码阅读
学习这个例子用于理解单纯的 dpdk 转发过程,L2 和 L3 的转发是基于此:在rte_eth_rx_burst()收包后进行解包,提取 mac.ip 等信息然后在转发到输出网卡. 如果要写出自己的 ...
- eg_6
问题描述: 将一句话的单词进行倒置,标点不倒置.比如 I like beijing. 经过函数后变为:beijing. like I Demo1: import java.util.Scanner; ...