博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SDOI 2016 生成魔咒 题解
阅读量:2307 次
发布时间:2019-05-09

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

题目大意: 给出一个字符串,询问它的每一个前缀内包含多少个不同的子串。

题解

将字符一个一个加入到SAM里,每个新的字符的的贡献为 l e n ( x ) − l e n ( l i n k ( x ) ) len(x)-len(link(x)) len(x)len(link(x)),因为从 l e n ( l i n k ( x ) ) len(link(x)) len(link(x)) 这个长度开始,下面的长度的后缀都已经出现过了,只有上面的后缀是没出现过的,即新的不同的子串。

代码如下:

#include 
#include
#include
#include
using namespace std;#define maxn 200010int n;long long ans=0;struct state{
int len,link; map
next;}st[maxn];int id=0,last=0,now,p,q;void extend(int x){
now=++id; st[now].len=st[last].len+1; for(p=last;p!=-1&&!st[p].next.count(x);p=st[p].link)st[p].next[x]=now; if(p!=-1) {
q=st[p].next[x]; if(st[p].len+1==st[q].len)st[now].link=q; else {
int clone=++id; st[clone]=st[q];st[clone].len=st[p].len+1; for(;p!=-1&&st[p].next[x]==q;p=st[p].link)st[p].next[x]=clone; st[q].link=st[now].link=clone; } } last=now;}int main(){
scanf("%d",&n); st[0].link=-1; for(int i=1,x;i<=n;i++) {
scanf("%d",&x); extend(x); ans+=st[now].len-st[st[now].link].len; printf("%lld\n",ans); }}

转载地址:http://ajnib.baihongyu.com/

你可能感兴趣的文章
php源码之路第三章第六节( 变量的生命周期之变量的赋值和销毁)
查看>>
【Day35】浅谈PHP拦截器之__set()与__get()的理解与使用方法
查看>>
php源码之路第四章第一节( 函数的内部结构)
查看>>
【Day36】PHP定时任务获取微信access_token
查看>>
数据库行转列的sql语句 (抛砖引玉)
查看>>
Java生成和解析XML格式文件和字符串的实例代码【dom4j中的SAXReader对象读取并解析xml文件】
查看>>
如何将tomcat控制台输出的内容直播用日志文件保存起来(Log4j)
查看>>
DB2 的 case when then else end 条件分支的处理
查看>>
POI读取Excel(兼容Excel2003、Excel2007)
查看>>
ActionContext(Struts中的Action类里)和ServletActionContext(HttpServlet类里的)【区别】小结
查看>>
关于ActionContext.getContext()的用法心得
查看>>
Struts2+JQuery.uploadify插件实现带进度的多文件上传示例【也可以设置去掉进度条的显示】
查看>>
用java存oracle数据库的date类型精确到秒【java.sql.Date 和java.util.Date的区别】
查看>>
jquery-easyui实现页面布局和增删改查操作(SSH2框架支持)
查看>>
EasyUI--datebox设置默认时间【dateTimeBox类似】
查看>>
easyui datetimebox处理【前台传递到后台是string类型,但是后台定义的是java.util.date,如何自动转换数据类型】
查看>>
jquery easyui 对于开始时间小于结束时间的判断示例
查看>>
java怎么判断两个Set 里的对象的值是否相同【两个set中的值是否相等】、java treeset和hashset如何判断元素是否相同【即对象是否完全相同;利用一个set去除重复元素】
查看>>
jQuery.validator.addMethod自定义验证方法【在表单验证中的使用 $("#appEdit_Form").validate({rules : {},messages:{}】
查看>>
jQuery怎么获取一些属性值类似的控件,又怎么遍历他们呢?
查看>>