loj6070【山东集训第一轮Day4】基因
题解:
- 分块对每个块的起点$st[i]$到$n$做一次回文自动机;
- 由于子串的回文自动机是原串的子图,所以并不需要重新构图,在原来的图上做即可;
- 做的时候记录某个终点的本质不同的回文串和$sum[i][r]$
- 对于询问$[l,r]$,直接统计$l$后的整块,考虑统计$l$所在的散块$[l,st[i]]$
- 根据回文串的对称性,可以预处理出在$st[i]$匹配的最长回文后缀节点,所以从st[i]到l暴力即可;
- 注意判断是否重复和是否超出边界;
- 暂时还不会两个log的做法;
1 #include<bits/stdc++.h> 2 #define rg register 3 using namespace std; 4 const int M=320,N=200010; 5 int T,n,m,typ,sz,ch[N][26],Fl[N][26],fl[N],end[M][N],pos[M][N]; 6 int sum[M][N],u,tot,bl[N],st[N],ed[N],lst,vis[N],len[N],s[N]; 7 inline char gc(){ 8 static char*p1,*p2,buf[1000000]; 9 if(p1==p2)p2=(p1=buf)+fread(buf,1,1000000,stdin); 10 return(p1==p2)?EOF:*p1++; 11 } 12 inline int rd(){ 13 int x=0;char c=gc(); 14 while(c<'0'||c>'9')c=gc(); 15 while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc(); 16 return x; 17 } 18 void extend1(int l,int i){ 19 int x=lst; 20 if(i-len[x]-1<l||s[i-len[x]-1]!=s[i])x=Fl[x][s[i]]; 21 if(!ch[x][s[i]]){ 22 len[++sz]=len[x]+2; 23 int y=fl[x]; 24 if(s[i-len[y]-1]!=s[i])y=Fl[y][s[i]];y=ch[y][s[i]]; 25 memcpy(Fl[sz],Fl[y],sizeof(Fl[y])); 26 Fl[sz][s[i-len[y]]]=fl[sz]=y; 27 ch[x][s[i]]=sz; 28 } 29 lst=x=ch[x][s[i]]; 30 } 31 void extend2(int i,int r){ 32 int x=lst; 33 if(i+len[x]+1>r||s[i+len[x]+1]!=s[i])x=Fl[x][s[i]]; 34 if(!ch[x][s[i]]){ 35 len[++sz]=len[x]+2; 36 int y=fl[x]; 37 if(s[i+len[y]+1]!=s[i])y=Fl[y][s[i]];y=ch[y][s[i]]; 38 memcpy(Fl[sz],Fl[y],sizeof(Fl[y])); 39 Fl[sz][s[i+len[y]]]=fl[sz]=y; 40 ch[x][s[i]]=sz; 41 } 42 lst=x=ch[x][s[i]]; 43 } 44 int main(){ 45 #ifndef ONLINE_JUDGE 46 freopen("loj6070.in","r",stdin); 47 freopen("loj6070.out","w",stdout); 48 #endif 49 typ=rd();n=rd();m=rd(); 50 u = sqrt(n); 51 char c=gc();while(!isalpha(c))c=gc(); 52 for(int i=1;i<=n;++i,c=gc()){ 53 bl[i]=(i-1)/u+1;ed[bl[i]]=i; 54 if(!st[bl[i]])st[bl[i]]=i; 55 s[i]=c-'a'; 56 }tot=bl[n]; 57 sz=1; 58 fl[0]=1;fl[1]=0; 59 len[0]=0;len[1]=-1; 60 for(rg int i=0;i<26;++i)Fl[0][i]=1; 61 memset(end,0x3f,sizeof(end)); 62 for(rg int i=1;i<=tot;++i){ 63 lst=0;T++; 64 for(rg int j=st[i];j<=n;++j){ 65 extend1(st[i],j); 66 sum[i][j]=sum[i][j-1]; 67 if(vis[lst]<T){ 68 vis[lst]=T; 69 sum[i][j]++; 70 end[i][lst]=j; 71 } 72 if(len[lst]==j-st[i]+1)pos[i][j]=lst; 73 else pos[i][j]=pos[i][j-1]; 74 } 75 } 76 int ans=0; 77 for(rg int i=1,l,r;i<=m;++i){ 78 T++; 79 l=rd();r=rd(); 80 if(typ)l^=ans,r^=ans; 81 if(bl[l]==bl[r]){ 82 lst=0;ans=0; 83 for(rg int j=l;j<=r;++j){ 84 extend1(l,j); 85 if(vis[lst]<T)vis[lst]=T,ans++; 86 } 87 }else{ 88 ans=sum[bl[l]+1][r]; 89 lst=pos[bl[l]+1][r]; 90 for(rg int j=ed[bl[l]];j>=l;--j){ 91 extend2(j,r); 92 if(vis[lst]<T&&end[bl[l]+1][lst]>r)vis[lst]=T,ans++; 93 } 94 } 95 printf("%d\n",ans); 96 } 97 return 0; 98 }
loj6070
转载于:https://www.cnblogs.com/Paul-Guderian/p/10311828.html
loj6070【山东集训第一轮Day4】基因相关推荐
- 2022年度前8强20强|香港科大-越秀集团百万奖金国际创业大赛·2022年度总决赛第一轮评审结果公布!...
2022年12月12日-21日,"香港科大-越秀集团"百万奖金国际创业大赛·2022年度总决赛[第一轮评审]圆满完成! 在本轮评审中,在各赛区前三名入围年度总决赛的23个项目中,评 ...
- 2019 CSP-J/S第一轮各省分数线统计与分析(含浙江省)
<CSP-J/S2019第一轮认证成绩及第二轮 晋级规则公示(浙江)>浙江省的分数线终于千呼万唤始出来, 浙江省A类:按第一轮认证成绩进行筛选,分数线和名额分配如下:J组入围线80分,共1 ...
- ccfcsp题库c语言,2019年CCF认证第一轮CSP-S信息学C++试题答案A卷
原标题:2019年CCF认证第一轮CSP-S信息学C++试题答案A卷 CSP-J/S是CCF创办的CSP(软件能力认证)中面向非专业级的软件能力认证,于今年首次开设,分为CSP-J(入门级,Junio ...
- CSP-J2021 第一轮(初赛)游记
# CSP-J2021 第一轮(初赛)游记 ## 前言 本次 CSP 已经是本蒟蒻的第三个赛季了.(**坐标:山东济南**) 首先回顾一下前两个赛季: $2019$:CSP-X 二等奖[小学组],当时 ...
- 2021年CSP-J/S 第一轮(初赛)各省的晋级分数线汇总分析
CSP-J/S 竞赛,比的不仅仅是选手的编程水平,还有我们对比赛相关信息的了解程度.比如:有一些省份的晋级分数线会很低,有些省份进行分区划分分数线······. 今天整理了 2021年CSP-J/S ...
- 第一轮通知 | 2022年中国生物物理学会肠道菌群分会年会暨“崂山论肠菌”学术论坛...
2022年中国生物物理学会肠道菌群分会年会 暨"崂山论肠菌"学术论坛 第一轮通知 为促进肠道菌群及相关领域科研工作者的合作和交流,由中国生物物理学会肠道菌群分会主办, 中国微 ...
- 皮一皮:据说这是英超第一轮之后的情况...
英超第一轮状态
- Java 9进入第一轮问题修复阶段
Java 9功能特性正式完成,这意味着第一个问题修复阶段已经开始.HTTP/2客户端没有在截止日期前完成,现已降级为孵化器功能.由于现在的目标是在7月准备好可发布的Java 9,所以目前不太可能添加任 ...
- 2022春招马蜂窝旅游网第一轮面试 面经
笔试->第一轮面试-> 1.MySQL调优 2.索引(问了底层,B+树) 3.线程的实现方式 4.线程池原理 5.I/O流 6.JUC中的锁(可重入锁.CompletableFuture) ...
最新文章
- AAAI 2021 | 语义解析最新进展解读
- 【学习备份】ajax添加小例子
- android闹钟的需求分析,手机小闹钟需求分析
- PHP实现弹出消息提示框的两种方法
- 前端打包利器webpack里utils.cssLoaders的工作原理调试
- 利用Java针对MySql封装的jdbc框架类 JdbcUtils 完整实现(包含增删改查、JavaBean反射原理,附源码)...
- 【英语学习】【Level 08】U04 What I love L5 Breathe in, breathe out
- B+/-Tree原理
- my java note -------String 类的实例化
- 医院CRM客户关系管理系统
- 八种颠覆未来作战的前沿技术
- java web 读取txt文件_java读取TXT文件
- springboot毕业设计题目课题参考
- divgrad怎么求_[怎样理解圆柱坐标系和球坐标系求梯度.散度]球坐标系梯度如何求...
- java date类 时区_Java Date 与时区
- 学习Python的基础,Python的数据类型和变量
- 数学建模之马尔萨斯模型(入门版)
- 安全测试之SQL注入攻击
- 基础练习:1085:球弹跳高度的计算
- 近日学习笔记:df -h和du -sh命令,查看linux版本,vbm管理工具,su命令,ssh服务升级技巧,source命令
热门文章
- Linux系统基础知识整理
- 大型分布式网站架构技术总结
- Asp.Net 学习资源列表
- 千万别在UI线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死...
- SimpleDateFormat线程不安全
- LeetCode算法题-Reverse Linked List(Java实现)
- 应用开发也去中心化?基于BCH的筹款平台Akari-Pages与Lighthouse正面交锋
- Java多线程之Lock接口
- MOSS 2010:Visual Studio 2010开发体验(26)——工作流开发概述
- MMA冠军Rory MacDonald:比特币现金(BCH)是真正的比特币