HDU 4622 本质不同的子串个数:后缀自动机
来源:互联网 发布:淘宝特卖女装清仓棉袄 编辑:程序博客网 时间:2024/06/05 08:33
题意:给出一个串,每次求一个子串[ l , r ]。问这个串中,本质不同的子串个数,多组询问,数据小。
题解:记住SAM是ON的。所以直接对每个[ l , r ]建SAM,然后建完就出答案。时间足够用。模板题为什么要写博客呢。。。。因为复用自动机的话。。要清空呀。。。。
Code:
#include<bits/stdc++.h>using namespace std;const int maxn = 2e3+100;char s[maxn];int len;int T;struct SAM{int last,cnt,nxt[maxn*2][26],fa[maxn*2],l[maxn*2];int ans;void init(){last = cnt=1;memset(nxt[1],0,sizeof nxt[1]);fa[1]=0;ans=0;l[1]=0;}int inline newnode(){++cnt;memset(nxt[cnt],0,sizeof nxt[cnt]);fa[cnt]=l[cnt]=0;return cnt;}void add(int c){int p = last;int np = newnode();last = np;l[np] = l[p]+1;while (p&&!nxt[p][c]){nxt[p][c]=np;p = fa[p];}if (!p){fa[np]=1;}else{int q = nxt[p][c];if (l[q]==l[p]+1){fa[np] = q;}else{int nq = newnode();memcpy(nxt[nq],nxt[q],sizeof nxt[q]);fa[nq] = fa[q];l[nq] = l[p]+1;fa[np]=fa[q]=nq;while (nxt[p][c]==q){nxt[p][c]=nq;p=fa[p];}}}//cout<<fa[last]<<endl;ans+=l[last]-l[fa[last]];}void query(){int l,r;scanf("%d%d",&l,&r);init();for (int i=l;i<=r;i++){//cout<<s[i]<<" ";add(s[i]-'a');}printf("%d\n",ans);}}sam;int main(){scanf("%d",&T);while (T--){scanf("%s",s+1);int Q;scanf("%d",&Q);while (Q--){sam.query();}}return 0;}
阅读全文
0 0
- HDU 4622 本质不同的子串个数:后缀自动机
- HDU 4622 Reincarnation(SAM 后缀自动机 求子串的不同子串个数)
- HDU 4622 Reincarnation (查询一段字符串的不同子串个数,后缀自动机)
- 后缀自动机(不同子串的个数)hdu4416
- 后缀自动机 重复旋律 5(求所有本质不同的子串)
- hdu 4416 后缀自动机 求一个字符串中出现的不同子串的个数(去除一些其他字符串的子串)
- HDU 4622 Reincarnation (区间不相同子串个数:字符串哈希 | 后缀数组 | 后缀自动机)
- 后缀自动机(子串个数)spoj8222
- 后缀自动机 求不同的子串数目
- 2017沈阳网络赛 1001 HDU 6194 string string string(后缀自动机 出现k次的子串个数)
- ACdream 1430 SETI 后缀自动机/后缀数组 不重叠子串的个数
- hdu 3948 后缀数组统计不同回文串的个数
- hdu 5769后缀数组 求含有某个字母的某个字符串的不同子串的个数
- hdu 4416 后缀自动机 问在S中有多少个不同子串满足它不是s1~sn中任意一个字符串的子串
- HDU 4641 至少出现K次本质不同子串数:后缀自动机
- 后缀自动机 重复旋律 7 求所有不同的子串的值的总和
- 若干的数字串所有不同子串的和 后缀自动机
- hdu 4622(后缀自动机)
- java动态代理、反射
- keepalived配置详解
- 百度面试总结
- 奋斗群群赛12总结与心得(缺4)
- 抽象类与接口
- HDU 4622 本质不同的子串个数:后缀自动机
- 两道挺有意思的基础题
- 获取窗口大小
- servlet和tomcat关系
- hdu 5128 The E-pang Palace 大力判矩形相交
- Java8学习记录(三)-强大的collect操作
- 线程——创建和启动
- 梯度下降法
- 二分查找第一个比k大的数