提交链接

题解

分为n\sqrt{n}n​ 个块,每个块预处理出起点到 n 的回文树,需要保存的信息有区间的回文串种类个数、区间的某种结点出现的最早位置以及区间的最长回文前缀对应的结点
后两个都是为了向前插入准备的
这是因为,如果向前插入的过程中,产生的一个新的结点,我们需要看这个结点在区间内是否出现过,
此外,向前插入,需要从最长回文前缀开始

这道题需要对回文树有深入的理解,并且要用到翁文涛在论文里讲的另一种快速插入的方式 quickquickquick,所以最好对论文有深入理解才能解决本题

代码

#include<bits/stdc++.h>
#define N 100010
#define INF 0x3f3f3f3f
#define eps 1e-6
#define pi 3.141592653589793
#define mod 1000000007
#define P 1000000007
#define LL long long
#define pb push_back
#define fi first
#define se second
#define cl clear
#define si size
#define lb lower_bound
#define ub upper_bound
#define bug(x) cerr<<#x<<"      :   "<<x<<endl
#define mem(x,y) memset(x,0,sizeof(int)*(y+3))
#define sc(x) scanf("%d",&x)
#define scc(x,y) scanf("%d%d",&x,&y)
#define sccc(x,y,z) scanf("%d%d%d",&x,&y,&z)
using namespace std;
typedef  pair<int,int> pp;
char s[N];
int p[320][N],ans[320][N],pos[320][N];
int vis[N],fail[N],len[N],a[N],nxt[N][26],qic[N][26],last,head,cnt,T;void init(){fail[0]=fail[1]=1,len[1]=-1;for(int i=0;i<26;i++) qic[0][i]=1;cnt=2;
}
inline int newnode(int l){len[cnt]=l;return cnt++;
}
void exback(int l,int i){int c=a[i];if (i-len[last]-1<l||a[i-len[last]-1]!=c) last=qic[last][c];if(!nxt[last][c]){int now=newnode(len[last]+2);int k=fail[last];if (a[i-len[k]-1]!=c) k=qic[k][c]; k=nxt[k][c];fail[now]=k;nxt[last][c]=now;memcpy(qic[now],qic[k],sizeof qic[k]);qic[now][a[i-len[k]]]=k;}last=nxt[last][c];if (len[last]==i-l+1) head=last;
}
void exfront(int i,int r){int c=a[i];if (i+len[head]+1>r||a[i+len[head]+1]!=c) head=qic[head][c];if(!nxt[head][c]){int now=newnode(len[head]+2);int k=fail[head];if (a[i+len[k]+1]!=c) k=qic[k][c]; k=nxt[k][c];fail[now]=k;nxt[head][c]=now;memcpy(qic[now],qic[k],sizeof qic[k]);qic[now][a[i+len[k]]]=k;}head=nxt[head][c];if (len[head]==r-i+1) last=head;
}int main(){int tpye,n,m,B;sccc(tpye,n,m); scanf("%s",s+1); B=sqrt(n);for(int i=1;i<=n;i++) a[i]=s[i]-'a';memset(pos,INF,sizeof pos);init();for(int L=1,i=1;L<=n;L+=B,i++){last=head=0; T++;for(int j=L;j<=n;j++){exback(L,j);ans[i][j]=ans[i][j-1];p[i][j]=head;if(vis[last]<T)vis[last]=T,pos[i][last]=j,ans[i][j]++;}}int Ans=0;while(m--){int L,R; scc(L,R);if (tpye) L^=Ans,R^=Ans; Ans=0;if ( (L-1)/B==(R-1)/B ){last=0; T++;for(int j=L;j<=R;j++){exback(L,j);if (vis[last]<T) Ans++,vis[last]=T;}}else{int i=(L-1)/B+1;Ans=ans[i+1][R];head=p[i+1][R]; T++;for(int j=i*B;j>=L;j--){exfront(j,R);if (vis[head]<T) Ans+=pos[i+1][head]>R,vis[head]=T;}}printf("%d\n",Ans);}
}

LOJ 6070基因 回文树 分块相关推荐

  1. 2014-2015 ACM-ICPC, Asia Xian Regional Contest G The Problem to Slow Down You 回文树

    The Problem to Slow Down You Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjud ...

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

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

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

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

  4. 回文树笔记(转自quack_quack)

    1.回文树的next[charset]指针: b->aba 那么就这样表示:b.next[a]=aba 当然树里面肯定不能存字符串,于是就直接用下标标号代替了 2.回文树的fail指针: 跟ac ...

  5. BZOJ2565 最长双回文子串 回文自动机,回文树

    bzoj2565: 最长双回文串 题意 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为"abc",逆序为"cba" ...

  6. HDU 5157(回文树)

    传送门 题面: Harry got a string T, he wanted to know the number of T's disjoint palindrome substring pair ...

  7. 【BZOJ2565】最长双回文串(回文树)

    [BZOJ2565]最长双回文串(回文树) 题面 BZOJ 题解 枚举断点\(i\) 显然的,我们要求的就是以\(i\)结尾的最长回文后缀的长度 再加上以\(i+1\)开头的最长回文前缀的长度 至于最 ...

  8. 回文树 / 自动机模板

    const int maxn = 400000; const int N = 26 ;struct Palindromic_Tree {int next[maxn][N] ;//next指针,next ...

  9. HYSBZ 2565 最长双回文串 (回文树)

    2565: 最长双回文串 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 1377  Solved: 714 [Submit][Status][Dis ...

  10. Palindromic Tree——回文树【处理一类回文串问题的强力工具】

    今天我们来学习一个神奇的数据结构:Palindromic Tree.中译过来就是--回文树. 那么这个回文树有何功能? 假设我们有一个串S,S下标从0开始,则回文树能做到如下几点: 1.求串S前缀0~ ...

最新文章

  1. 第十六届全国大学智能汽车竞赛竞速比赛规则
  2. 嵌入式 Hi3515视频编码(H.264)笔记
  3. 利用cross join 构造大量测试数据
  4. Python如何打包EXE可执行文件
  5. Android手机编程初学遇到的问题及解决方法
  6. fastjson和json-lib的区别
  7. 60-40-020-序列化-自定义序列化
  8. 余承东:华为P50系列无5G版本,但依然流畅
  9. L2-022 重排链表-PAT团体程序设计天梯赛GPLT
  10. 【OpenGL基础篇】——使用面向对象方法封装OpenGL函数(二)
  11. 并发入库面临重复数据的问题
  12. C/C++之strcpy功能实现
  13. java zinterstore_Java架构之Redis系列:通过文章点赞排名案例学习Sortedset命令
  14. python获取列表控件_PyQt学习随笔:ListView控件获取当前选择项的方法
  15. 干燥环境对电子器件的影响
  16. 京东VS淘宝:待付款订单-再次支付方案对比
  17. 网吧游戏服务器制作教程,图文教程:网吧无盘系统服务端设置细节
  18. Springboot官网学习(5、深入Springboot之SpringApplication【五自定义横幅】)
  19. win10的开机启动目录(文件夹)位置
  20. devc++ value of xxx too large for field of 4 bytes at xxx 并且源文件未编译

热门文章

  1. GIT LFS 原理杂谈
  2. APISpace 汉字转拼音API 方便好用
  3. 100m光纤测速多少正常_100M的光纤电信宽带,用手机测速时,为什么只有40M?
  4. 项目需求分析答辩总结(含评审结果)——日不落战队
  5. 智能网联汽车OTA升级安全设计
  6. 30个Eclipse键盘快捷键大全,让你工作效率翻倍
  7. light动名词_英语中什么叫动名词?加ING的就是吗?
  8. python人民币转大写_python实现人民币大写转换
  9. 金融壹账通冲刺港股:9个月亏10亿 半年前刚换帅
  10. 2022年8种高级威胁预测出炉、FBI就零日漏洞发出警报|11月22日全球网络安全热点