2017.10.9 找相同字符 失败总结
一上来先想到hash和dp。。
其实散的连续子串匹配问题后缀相关都是可以解决的
对于SA,,就只需两个串之间加#,然后扔到SA里,单调栈维护lcp贡献就可以了,,但似乎并不好写,SA的大循环容易残
于是%ISA%到了后缀树。
就是把SAM的fail扒下来。。就变成了一棵树
然后原来的SAM上的拓扑基数排序就可以直接在后缀树上直观的dfs了。。
然后后缀树上的节点存的是 节点代表串的最长前延伸和出现位置和
所以 一个节点代表一类子串 sz就是这一类子串个数,l就是这一类子串中最长的长度。。就可以维护很多信息
广义后缀自动机: 多串匹配问题
就是原来的SAM,如果有节点并且是可以直接连接的(len【p】+1==len【np】) 就直接沿用, ++sz就不用管了
如果没有节点就新建, 剩下的就和加一个字符没什么区别了。。注意有些节点sam不会访问到了,但sz的信息依然有用,仍然需要建在后缀树中
注:开800000,,因为有两个串。。
码(还是SAM好写,就是比较难懂):
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
#define ll long long
int np,p,nq,q,tot=1,i,l[800005],sz[800005][2],sp[800005],ch[800005][27],len;
ll ans;
char str[800005];
vector<int>v[800005];
void jia(int o,int lx)
{int i;
if(ch[np][o]!=0&&l[ch[np][o]]==l[np]+1){ np=ch[np][o] ; sz[np][lx]=1; return;}p=np; np=++tot; l[np]=l[p]+1;sz[np][lx]=1;for(;ch[p][o]==0&&p;p=sp[p])ch[p][o]=np;if(p==0)sp[np]=1;else{q=ch[p][o];if(l[q]==l[p]+1)sp[np]=q;else{nq=++tot;l[nq]=l[p]+1;for(i=0;i<=25;i++)ch[nq][i]=ch[q][i];sp[nq]=sp[q];sp[q]=sp[np]=nq;for(;ch[p][o]==q;p=sp[p])ch[p][o]=nq; } }
}
void dfs2(int o,int fa)
{int i;
for(i=0;i<v[o].size();i++) if(v[o][i]>0){dfs2(v[o][i],o);sz[o][0]+=sz[v[o][i]][0];sz[o][1]+=sz[v[o][i]][1]; }ans+=(1ll*sz[o][0]*sz[o][1])*1ll*(l[o]-l[fa]);
}
int main()
{np=1;scanf("%s",str);len=strlen(str);for(i=0;i<len;i++)jia(str[i]-'a',0);np=1;scanf("%s",str);len=strlen(str);for(i=0;i<len;i++)jia(str[i]-'a',1); for(i=2;i<=tot;i++)v[sp[i]].push_back(i);dfs2(1,0);printf("%lld",ans);
}
2017.10.9 找相同字符 失败总结相关推荐
- 2017.10.28 管道取珠 失败总结
这个题有一个新套路: ∑ai^2 要知道一般的计数题是∑ai,,所以这多乘了一个自己有什么意义呢? 于是想到,两两枚举,加起来正好是ai^2:: 所以就有一个想法,枚举两种取法, 然后就是插数dp, ...
- 2017.10.23 卡牌游戏 失败总结
dp好难啊.. 这个题主要是离散点找不准,但其实也就这样 1.尝试状态压缩,状态爆炸 2.状态里面1很多,尝试统计1的个数 3.枚举起点 但这样做还是没法做,因为没有终点 所以就再枚举一层终点.. 就 ...
- 2017.10.22 最多的方案 失败总结
老想着数表结合的方法,,结果就是找不到规律. 这个题看起来好像是一个函数就可以做,但其实不是的,斐波那契函数有很好的形势:f[i]=f[i-1]+f[i-2], 他可以看成两个点转移到一个点,也可以看 ...
- 2017.10.27 sue的小球 失败总结
这个题是论文题...说这个题之前先说一下关路灯 这两个题都有时间的限制,但都不能作为状态设计进去 关路灯那个题,由于要忽略时间的限制,所以对于一个区间省得最多,是不是就是最优解了呢 首先,就算你知道这 ...
- 2017.10.25 书柜的尺寸 失败总结
这题只能想到第一步.. 首先题目要求的是最小化两个变量的关系,那就必须转化成一个变量的关系,化动为静 比如:枚举限制因素,枚举所有值,再或者就是贪心 一开始想到枚举限制因素,即枚举三个集合中高度最大的 ...
- 2017.10.24 学校食堂Dining 失败总结
这题目描述不清啊.省选应该有人解释吧, 对着理解错的题调了一上午... 注意 如果一个人b==5 那这个人后面6个以后的都不能在这个人以前选 这个题就是怎么处理7的问题,状压枚举,同时满足条件的选人 ...
- 2017.10.7 phi的反函数 失败总结
数论题好难啊,,分析也好,爆搜也好,剪枝也好,什么都不会啊 一开始能想到的就只有根据单点求phi来进行反推... 然后并不能保证最小解,,而且搜索意味不明. 其实需要注意到任意的phi值 全部都是可以 ...
- Java黑皮书课后题第5章:5.10(找出能被5和6整除的数)编写程序,显示从100到1000之间所有能被5和6整除的数,每行显示10个。数字之间用一个空格字符隔开
5.10(找出能被5和6整除的数)编写程序,显示从100到1000之间所有能被5和6整除的数,每行显示10个.数字之间用一个空格字符隔开 题目 题目概述 破题 引申:continue break与re ...
- NOIP2017模拟赛总结(2017.10.30-2017.11.1)
第三篇博客,放上2017.10.30-2017.11.1的题. 2017.10.30 Problem A 题目大意: 有一排nnn棵果树和一个容量为sss的果篮,从前往后摘果,如果当前果树的果子数量不 ...
最新文章
- Adobe推出HTML5动画设计工具Edge
- JDK动态代理和CGLIB代理的区别
- 详解音视频直播中的低延时
- 梅森增益matlab求解,梅森公式互不接触回路及其增益
- 【Spring中使用MongoTemplate查询数据】
- php28,ajax2—php(28)
- 494. 目标和(JavaScript)
- 【物联网智能网关-08】TinyGUI和WPF汉字显示技术比较
- php 中function_PHP中的function函数详解
- Flexsim——初学AGV必看的知识点(如何解决AGV锁死的情况)
- Vscode下中文乱码问题
- 为什么CTO、技术总监、架构师都不写代码,还这么厉害
- HTML meta标签使用介绍
- STOpen硬件设计4-周边模块设计二(CAN+RS485+UART+IO扩展等)
- python数据库-3
- 如何使用互联网思维,解决流浪动物问题
- 录音系列:录音文件为啥是.wav格式?
- -Djava.security.egd=file:/dev/./urandom参数的作用
- 7、em/px/rem/vh/vw区别?
- 【转载】嵌入式加密芯片为电子产品版权护航
热门文章
- Spark内核解析1
- Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名
- 360 c语言 笔试,奇虎360校招的笔试真题
- java 装饰器_装饰器模式(Java)
- Python刷题-2
- Linux(一):VMware安装出现的问题
- python的json dump_python中json.dump和json.dumps的区别
- android 销毁按钮,Android实现所有Activity全部销毁
- 红外倒车雷达原理图_自动驾驶汽车传感器技术解析—毫米波雷达
- linux文件压缩包,linux目录文件压缩包操作