一上来先想到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 找相同字符 失败总结相关推荐

  1. 2017.10.28 管道取珠 失败总结

    这个题有一个新套路:  ∑ai^2 要知道一般的计数题是∑ai,,所以这多乘了一个自己有什么意义呢? 于是想到,两两枚举,加起来正好是ai^2:: 所以就有一个想法,枚举两种取法, 然后就是插数dp, ...

  2. 2017.10.23 卡牌游戏 失败总结

    dp好难啊.. 这个题主要是离散点找不准,但其实也就这样 1.尝试状态压缩,状态爆炸 2.状态里面1很多,尝试统计1的个数 3.枚举起点 但这样做还是没法做,因为没有终点 所以就再枚举一层终点.. 就 ...

  3. 2017.10.22 最多的方案 失败总结

    老想着数表结合的方法,,结果就是找不到规律. 这个题看起来好像是一个函数就可以做,但其实不是的,斐波那契函数有很好的形势:f[i]=f[i-1]+f[i-2], 他可以看成两个点转移到一个点,也可以看 ...

  4. 2017.10.27 sue的小球 失败总结

    这个题是论文题...说这个题之前先说一下关路灯 这两个题都有时间的限制,但都不能作为状态设计进去 关路灯那个题,由于要忽略时间的限制,所以对于一个区间省得最多,是不是就是最优解了呢 首先,就算你知道这 ...

  5. 2017.10.25 书柜的尺寸 失败总结

    这题只能想到第一步.. 首先题目要求的是最小化两个变量的关系,那就必须转化成一个变量的关系,化动为静 比如:枚举限制因素,枚举所有值,再或者就是贪心 一开始想到枚举限制因素,即枚举三个集合中高度最大的 ...

  6. 2017.10.24 学校食堂Dining 失败总结

    这题目描述不清啊.省选应该有人解释吧, 对着理解错的题调了一上午... 注意  如果一个人b==5 那这个人后面6个以后的都不能在这个人以前选 这个题就是怎么处理7的问题,状压枚举,同时满足条件的选人 ...

  7. 2017.10.7 phi的反函数 失败总结

    数论题好难啊,,分析也好,爆搜也好,剪枝也好,什么都不会啊 一开始能想到的就只有根据单点求phi来进行反推... 然后并不能保证最小解,,而且搜索意味不明. 其实需要注意到任意的phi值 全部都是可以 ...

  8. Java黑皮书课后题第5章:5.10(找出能被5和6整除的数)编写程序,显示从100到1000之间所有能被5和6整除的数,每行显示10个。数字之间用一个空格字符隔开

    5.10(找出能被5和6整除的数)编写程序,显示从100到1000之间所有能被5和6整除的数,每行显示10个.数字之间用一个空格字符隔开 题目 题目概述 破题 引申:continue break与re ...

  9. NOIP2017模拟赛总结(2017.10.30-2017.11.1)

    第三篇博客,放上2017.10.30-2017.11.1的题. 2017.10.30 Problem A 题目大意: 有一排nnn棵果树和一个容量为sss的果篮,从前往后摘果,如果当前果树的果子数量不 ...

最新文章

  1. Adobe推出HTML5动画设计工具Edge
  2. JDK动态代理和CGLIB代理的区别
  3. 详解音视频直播中的低延时
  4. 梅森增益matlab求解,梅森公式互不接触回路及其增益
  5. 【Spring中使用MongoTemplate查询数据】
  6. php28,ajax2—php(28)
  7. 494. 目标和(JavaScript)
  8. 【物联网智能网关-08】TinyGUI和WPF汉字显示技术比较
  9. php 中function_PHP中的function函数详解
  10. Flexsim——初学AGV必看的知识点(如何解决AGV锁死的情况)
  11. Vscode下中文乱码问题
  12. 为什么CTO、技术总监、架构师都不写代码,还这么厉害
  13. HTML meta标签使用介绍
  14. STOpen硬件设计4-周边模块设计二(CAN+RS485+UART+IO扩展等)
  15. python数据库-3
  16. 如何使用互联网思维,解决流浪动物问题
  17. 录音系列:录音文件为啥是.wav格式?
  18. -Djava.security.egd=file:/dev/./urandom参数的作用
  19. 7、em/px/rem/vh/vw区别?
  20. 【转载】嵌入式加密芯片为电子产品版权护航

热门文章

  1. Spark内核解析1
  2. Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名
  3. 360 c语言 笔试,奇虎360校招的笔试真题
  4. java 装饰器_装饰器模式(Java)
  5. Python刷题-2
  6. Linux(一):VMware安装出现的问题
  7. python的json dump_python中json.dump和json.dumps的区别
  8. android 销毁按钮,Android实现所有Activity全部销毁
  9. 红外倒车雷达原理图_自动驾驶汽车传感器技术解析—毫米波雷达
  10. linux文件压缩包,linux目录文件压缩包操作