LOJ6070 基因 分块+回文自动机
这个在翁文涛的论文里有讲到
大概的就是一个子串的回文自动机是原串回文自动机的子图
于是每隔\(\sqrt n\)重新跑一个\((k \times \sqrt n,n)\)的回文自动机 记录回文串个数和位置 并且分别维护后缀的\(fail\)和前缀的\(fail\)
每次询问\((l,r)\)只需要把\((k \times\sqrt n,r)\)的答案直接加上 再暴力添加\((l,(k \times\sqrt n)-1)\)这一段就可以得到\(ans\)了
只理解了大概 只能以后遇到题再加强了
\(update:\)新写了一篇\(BZOJ5384\)的博客,但是用那一题的方法加上主席树可以做到更优的复杂度
#include<bits/stdc++.h>
using namespace std;
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define pa pair<int,int>
#define mod 1000000007
#define ll long long
#define mk make_pair
#define pb push_back
#define fi first
#define se second
#define cl(x) memset(x,0,sizeof x)
#ifdef Devil_Gary
#define bug(x) cout<<(#x)<<" "<<(x)<<endl
#define debug(...) fprintf(stderr, __VA_ARGS__)
#else
#define bug(x)
#define debug(...)
#endif
const int INF = 0x7fffffff;
const int N=1e5+5;
const int M=355;
/*
char *TT,*mo,but[(1<<15)+2];
#define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin),TT==mo))?-1:*TT++)//*/
inline int read(){
int x=0,rev=0,ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')rev=1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return rev?-x:x;
}
int type,n,S,T,Q,a[N],Ans,id=1;
int ans[M][N],p[M][N],pos[M][N];
int pb,pf,c[N][26],qf[N][26],f[N],len[N],vis[N];
char s[N];
void exback(int l,int i){
int x=a[i];
if(i-len[pb]-1<l||a[i-len[pb]-1]!=x) pb=qf[pb][x];
if(!c[pb][x]){
len[++id]=len[pb]+2;
int k=f[pb];
if(a[i-len[k]-1]!=x) k=qf[k][x]; k=c[k][x];
memcpy(qf[id],qf[k],sizeof qf[k]);
qf[id][a[i-len[k]]]=k,f[id]=k,c[pb][x]=id;
}
pb=c[pb][x];
if(len[pb]==i-l+1) pf=pb;
}
void exfront(int i,int r){
int x=a[i];
if(i+len[pf]+1>r||a[i+len[pf]+1]!=x) pf=qf[pf][x];
if(!c[pf][x]){
len[++id]=len[pf]+2;
int k=f[pf];
if(a[i+len[k]+1]!=x) k=qf[k][x];k=c[k][x];
memcpy(qf[id],qf[k],sizeof qf[k]);
qf[id][a[i+len[k]]]=k,f[id]=k,c[pf][x]=id;
}
pf=c[pf][x];
if(len[pf]==r-i+1) pb=pf;
}
int calc(int x){
return (x-1)/S+1;
}
int main(){
#ifdef Devil_Gary
freopen("in.txt","r",stdin);
#endif
type=read(),n=read(),Q=read(),S=sqrt(n),scanf("%s",s+1);
for(int i=1;i<=n;i++) a[i]=s[i]-'a';
f[0]=f[1]=1,len[1]=-1;
for(int i=0;i<26;i++) qf[0][i]=1;
memset(pos,127/3,sizeof pos);
for(int L=1,i=1;L<=n;L+=S,i++){
pb=pf=0,++T;
for(int j=L;j<=n;j++){
exback(L,j);
ans[i][j]=ans[i][j-1],p[i][j]=pf;
if(vis[pb]<T) vis[pb]=T,pos[i][pb]=j,ans[i][j]++;
}
}
while(Q--){
int L=read(),R=read();
if(type) L^=Ans,R^=Ans;Ans=0;
if(calc(L)==calc(R)){
pb=0,++T;
for(int j=L;j<=R;j++){
exback(L,j);
if(vis[pb]<T) ++Ans,vis[pb]=T;
}
}
else{
int i=calc(L);Ans=ans[i+1][R];
pf=p[i+1][R],++T;
for(int j=i*S;j>=L;j--){
exfront(j,R);
if(vis[pf]<T) vis[pf]=T,Ans+=pos[i+1][pf]>R;
}
}
printf("%d\n",Ans);
}
}
LOJ6070 基因 分块+回文自动机的更多相关文章
- URAL 2040 (回文自动机)
Problem Palindromes and Super Abilities 2 (URAL2040) 题目大意 给一个字符串,从左到右依次添加,询问每添加一个字符,新增加的回文串数量. 解题分析 ...
- URAL 2040 Palindromes and Super Abilities 2 (回文自动机)
Palindromes and Super Abilities 2 题目链接: http://acm.hust.edu.cn/vjudge/contest/126823#problem/E Descr ...
- 后缀自动机/回文自动机/AC自动机/序列自动机----各种自动机(自冻鸡) 题目泛做
题目1 BZOJ 3676 APIO2014 回文串 算法讨论: cnt表示回文自动机上每个结点回文串出现的次数.这是回文自动机的定义考查题. #include <cstdlib> #in ...
- [模板] 回文树/回文自动机 && BZOJ3676:[Apio2014]回文串
回文树/回文自动机 放链接: 回文树或者回文自动机,及相关例题 - F.W.Nietzsche - 博客园 状态数的线性证明 并没有看懂上面的证明,所以自己脑补了一个... 引理: 每一个回文串都是字 ...
- BZOJ2160拉拉队排练——回文自动机
题目描述 艾利斯顿商学院篮球队要参加一年一度的市篮球比赛了.拉拉队是篮球比赛的一个看点,好的拉拉队往往能帮助球队增加士气,赢得最终的比赛.所以作为拉拉队队长的楚雨荨同学知道,帮助篮球队训练好拉拉队有多 ...
- BZOJ2084[Poi2010]Antisymmetry——回文自动机
题目描述 对于一个01字符串,如果将这个字符串0和1取反后,再将整个串反过来和原串一样,就称作“反对称”字符串.比如00001111和010101就是反对称的,1001就不是.现在给出一个长度为N的0 ...
- BZOJ2342[Shoi2011]双倍回文——回文自动机
题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...
- 【XSY2715】回文串 树链剖分 回文自动机
题目描述 有一个字符串\(s\),长度为\(n\).有\(m\)个操作: \(addl ~c\):在\(s\)左边加上一个字符\(c\) \(addr~c\):在\(s\)右边加上一个字符 \(tra ...
- 字符串数据结构模板/题单(后缀数组,后缀自动机,LCP,后缀平衡树,回文自动机)
模板 后缀数组 #include<bits/stdc++.h> #define R register int using namespace std; const int N=1e6+9; ...
随机推荐
- mysql授权报错 ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
授权用户时报错,ERROR 1819 (HY000): Your password does not satisfy the current policy requirements 原因为其实与val ...
- 在Linux,误删磁盘分区怎么恢复呢【转】
在我们运维工作中,频繁的操作,可能命令写入错误,造成磁盘分区的删除,那么应该怎么办呢?怎么恢复磁盘分区呢? 一不小心删除了磁盘分区.如下图,删除了sda磁盘的第一个分区,为系统boot分区,系统如果重 ...
- plsql developer日期类型数据格式不对如何设置?
当把一个数据库中的数据复制到另一个数据库时,如果数据中包含日期类型,会提示数据格式不正确.或者两个plsql developer设置不同,但实际上建表语句一样. 此时可在plsql中做如下设置: 首选 ...
- centos6.5环境openldap实战之ldap配置详解及web管理工具lam(ldap-account-manager)使用详解
ldap常用名称解释 1.环境搭建 操作系统:centos6.5 x86_64 关闭防火墙.selinux 开启时间同步 # crontab -e 加入 # time sync */5 * * * * ...
- jQuery版本的jsonp
1.一个众所周知的问题,Ajax直接请求普通文件存在跨域无权限访问的问题,甭管你是静态页面.动态网页.web服务.WCF,只要是跨域请求,一律不准: 2.不过我们又发现,Web页面上调用js文件时则不 ...
- 【转载】JavaScript中的属性:如何遍历属性
转载自:http://www.cnblogs.com/ziyunfei/archive/2012/11/03/2752905.html 在JavaScript中,遍历一个对象的属性往往没有在其他语言中 ...
- python3笔记(二)Python语言基础
缩进 要求严格的代码缩进是python语法的一大特色,就像C语言家族(C.C++.Java等等)中的花括号一样重要,在大多数场合还非常有必要.在很多代码规范里面也都有要求代码书写按照一定的规则进行换行 ...
- springMVC3学习--ModelAndView对象(转)
原文链接:springMVC3学习(二)--ModelAndView对象 当控制器处理完请求时,通常会将包含视图名称或视图对象以及一些模型属性的ModelAndView对象返回到DispatcherS ...
- python 全栈开发,Day50(Javascript简介,第一个JavaScript代码,数据类型,运算符,数据类型转换,流程控制,百度换肤,显示隐藏)
一.Javascript简介 Web前端有三层: HTML:从语义的角度,描述页面结构 CSS:从审美的角度,描述样式(美化页面) JavaScript:从交互的角度,描述行为(提升用户体验) Jav ...
- python 全栈开发,Day2(in,while else,格式化输出,逻辑运算符,int与bool转换,编码)
一.in的使用 in 操作符用于判断关键字是否存在于变量中 a = '男孩wusir' print('男孩' in a) 执行输出: True in是整体匹配,不会拆分匹配. a = '男孩wusir ...