博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Jzoj4384 Hashit
阅读量:5241 次
发布时间:2019-06-14

本文共 1274 字,大约阅读时间需要 4 分钟。

你有一个字符串S,最开始为空,要求支持两种操作

在S后面加入字符c

删除S最后一个字符

每次操作询问S有多少个两两不同子串

应该本来应该用SAM+Trie离线做的,然而为了练一下后缀平衡树就写了

其实也很好写,用哈希比较一下就好了,可以用set实现,开一个数组存每个后缀对应的节点就好

求height也可以用哈希

#pragma GCC opitmize("O3")#pragma G++ opitmize("O3")#include
#include
#include
#include
#define LL long longusing namespace std;char s[100010]; int n=0;LL h[100010],bas[100010]={
1};struct suffix{ int x; };inline LL gH(int l,int r){ return h[r]-h[l-1]*bas[r-l+1]; }inline int lcp(int x,int y){ if(x==y) return 0; int l=-1,r=min(x,y)-1; for(int m;l
>1; if(gH(x-m,x)==gH(y-m,y)) l=m; else r=m-1; } return l+1;}inline bool operator< (suffix a,suffix b){ int c=lcp(a.x,b.x); return s[a.x-c]
w;multiset
::iterator c[100010],p,q;int main(){ int ans=0; for(int i=1;i<=100000;++i) bas[i]=bas[i-1]*27; for(char o;;){ o=getchar(); if(o=='-'){ p=q=c[n]; ++p; --q; ans-=n-lcp(p->x,n)-lcp(n,q->x)+(p->x==n || q->x==n?0:lcp(p->x,q->x)); w.erase(c[n--]); } else if(o>='a' && o<='z'){ s[++n]=o; h[n]=h[n-1]*27+o-'a'; p=q=c[n]=w.insert((suffix){n}); ++p; --q; ans+=n-lcp(p->x,n)-lcp(n,q->x)+(p->x==n || q->x==n?0:lcp(p->x,q->x)); } else break; printf("%d\n",ans); }}

转载于:https://www.cnblogs.com/Extended-Ash/p/9477170.html

你可能感兴趣的文章
Nginx配置文件(nginx.conf)配置详解1
查看>>
linux php编译安装
查看>>
name phone email正则表达式
查看>>
721. Accounts Merge
查看>>
「Unity」委托 将方法作为参数传递
查看>>
重置GNOME-TERMINAL
查看>>
redis哨兵集群、docker入门
查看>>
hihoCoder 1233 : Boxes(盒子)
查看>>
oracle中anyData数据类型的使用实例
查看>>
C++对vector里面的元素排序及取任意重叠区间
查看>>
软件测试——性能测试总结
查看>>
12.4站立会议
查看>>
Java Concurrentmodificationexception异常原因和解决方法
查看>>
客户端访问浏览器的流程
查看>>
codeforces水题100道 第二十二题 Codeforces Beta Round #89 (Div. 2) A. String Task (strings)
查看>>
c++||template
查看>>
[BZOJ 5323][Jxoi2018]游戏
查看>>
编程面试的10大算法概念汇总
查看>>
Vue
查看>>
python-三级菜单和购物车程序
查看>>