这个在翁文涛的论文里有讲到

大概的就是一个子串的回文自动机是原串回文自动机的子图
于是每隔\(\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_Garyfreopen("in.txt","r",stdin);
#endiftype=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);}
}

转载于:https://www.cnblogs.com/devil-gary/p/9213689.html

LOJ6070 基因 分块+回文自动机相关推荐

  1. 【回文自动机】bzoj3676 [Apio2014]回文串

    回文自动机讲解!http://blog.csdn.net/u013368721/article/details/42100363 pam上每个点代表本质不同的回文子串.len(i)代表长度,cnt(i ...

  2. 算法学习:回文自动机

    [定义] [自动机] 参照AC自动机 [前置知识] [AC自动机] [manacher] 其实不学这两个也可以,但是学过之后会更方便理解 [解决问题] 主要解决回文串的问题 能求出   字符串中回文子 ...

  3. 回文树(回文自动机) - URAL 1960 Palindromes and Super Abilities

     Palindromes and Super Abilities Problem's Link:  http://acm.timus.ru/problem.aspx?space=1&num=1 ...

  4. 【知识总结】回文自动机(Palindrome_Automaton)

    参考资料:Palindromic Tree--回文树[处理一类回文串问题的强力工具](请注意,其中似乎有一些错误) 回文自动机似乎和回文树是同一个东西qwq? 回文自动机(PAM)是一种处理回文串的工 ...

  5. 论如何优雅的处理回文串 - 回文自动机详解

    写在前面 最近无意中看到了这个数据结构,顺便也就学习了一下. 而且发现网上关于这个算法的描述有很多地方是错的,在这里做了一些更正. 处理字符串的算法很多: KMP,E-KMP,AC自动机,后缀三兄弟: ...

  6. BZOJ2342[Shoi2011]双倍回文——回文自动机

    题目描述 输入 输入分为两行,第一行为一个整数,表示字符串的长度,第二行有个连续的小写的英文字符,表示字符串的内容. 输出 输出文件只有一行,即:输入数据中字符串的最长双倍回文子串的长度,如果双倍回文 ...

  7. BZOJ4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)

    好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...

  8. BZOJ 4044 Luogu P4762 [CERC2014]Virus Synthesis (回文自动机、DP)

    好难啊..根本不会做..基本上是抄Claris... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4044 (luogu) ...

  9. 回文树或者回文自动机,及相关例题

    回文树简述 在大部分说法中,回文树与回文自动机指的是一个东西: 回文树是对一个字符串,基于自动机思想构建的处理回文问题的树形结构: 回文树是对着一个单串建立的: 于是他主要用于计数(回文子串种类及个数 ...

  10. HDU-6599 I Love Palindrome String(回文自动机+字符串hash)

    题目链接 题意:给定一个字符串\(|S|\le 3\times 10^5\) 对于每个 \(i\in [1,|S|]\) 求有多少子串\(s_ls_{l+1}\cdots s_r\)满足下面条件 \( ...

最新文章

  1. linux 下挂载光盘
  2. 电子海图中点在多边形内的判定
  3. redis代码 数据超时实现
  4. 二.安全NA之ASA基础
  5. P4983-忘情【wqs二分,斜率优化】
  6. 安卓手机状态栏 定位服务自动关闭_手机电池为什么会越用越不耐用
  7. 一个两年Java的面试总结
  8. linux程序流量平滑,Linux下按程序查实时流量 network traffic(示例代码)
  9. 代码之美~强大的构造方法重载
  10. 小程序使用绑定手机号码接口显示失败
  11. fatal error LNK1120: 1 个无法解析的外部命令 的解决办法
  12. 如何使用计算机创电子表格,计算机如何创建表格?
  13. iMazing2021mac win最先进的苹果iPhone和iPad管理软件
  14. 关于FlashDB的应用-GD32F450上
  15. 【翻译】CVPR2022: Pyramid Grafting Network for One-Stage High ResolutionSaliency Detection
  16. as使用git@oschina
  17. sumo设置公交车站_城市交通仿真平台SUMO.pdf
  18. 设计大牛不愿意告诉小白的6款设计软件
  19. MariaDB GRANT ALL PRIVILEGES Access denied for user
  20. python炫酷gui界面_python+tkinter+动画图片+爬虫(查询天气)的GUI图形界面设计

热门文章

  1. 小程序自动定位当前位置
  2. 【OpenStack】OpenStack系列17之OpenStack私有云设计一
  3. c#中PROCESS的用法
  4. 坚持#第212天~零基础自学云计算基础语言应用1~5节
  5. 某些网页页面偏左,什么原因?
  6. 如何写好一篇综述类论文?
  7. python短文本数据集的关联性_短文本分析----基于python的TF-IDF特征词标签自动化提取...
  8. H5标签datalist
  9. 智能家居的新想法(2022)
  10. 简述计算机数控系统的工作原理,计算机数控系统与802D系统编程基本原理