2018.12.15 poj3415 Common Substrings(后缀自动机)
传送门
后缀自动机基础题。
给两个字符串,让你求长度不小于kkk的公共子串的数量。
这题可以用后缀自动机解决废话
考虑对其中一个字串建出后缀自动机,然后用另一个在上面跑,注意到如果一个状态有贡献的话,从它到根的状态都会有贡献,因此我们给每个节点打一个懒标记最后再统计一次答案即可。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ri register int
using namespace std;
const int N=2e5+5;
typedef long long ll;
int k,n;
char s[N];
inline int calc(char c){return c>='a'&&c<='z'?c-'a':c-'A'+26;}
struct SAM{
int tot,rt,last,len[N],link[N],son[N][60],siz[N],lz[N],cnt[N],rk[N];
inline void init(){
memset(len,0,sizeof(len)),memset(siz,0,sizeof(siz)),memset(rk,0,sizeof(rk)),memset(son,0,sizeof(son));
memset(link,0,sizeof(link)),memset(cnt,0,sizeof(cnt)),memset(lz,0,sizeof(lz)),tot=last=rt=1,len[0]=-1;
}
inline void expend(int x){
int p=last,np=++tot;
siz[last=np]=1,len[np]=len[p]+1;
while(p&&!son[p][x])son[p][x]=np,p=link[p];
if(!p){link[np]=rt;return;}
int q=son[p][x],nq;
if(len[q]==len[p]+1){link[np]=q;return;}
len[nq=++tot]=len[p]+1,memcpy(son[nq],son[q],sizeof(son[q])),link[nq]=link[q];
while(p&&son[p][x]==q)son[p][x]=nq,p=link[p];
link[q]=link[np]=nq;
}
inline void topsort(){
for(ri i=1;i<=tot;++i)++cnt[len[i]];
for(ri i=1;i<=last;++i)cnt[i]+=cnt[i-1];
for(ri i=1;i<=tot;++i)rk[cnt[len[i]]--]=i;
for(ri i=tot;i;--i)siz[link[rk[i]]]+=siz[rk[i]];
}
inline void query(){
topsort();
int p=1,nowlen=0;
ll ans=0;
for(ri i=1;i<=n;++i){
int x=calc(s[i]);
if(son[p][x])p=son[p][x],++nowlen;
else{
while(p&&!son[p][x])p=link[p];
if(!p)p=1,nowlen=0;
else nowlen=len[p]+1,p=son[p][x];
}
if(nowlen>=k){
ans+=(ll)(nowlen-max(k,len[link[p]]+1)+1)*siz[p];
if(len[link[p]]>=k)++lz[link[p]];
}
}
for(ri i=tot;i;--i){
p=rk[i];
ans+=(ll)lz[p]*siz[p]*(len[p]-max(k,len[link[p]]+1)+1);
if(len[link[p]]>=k)lz[link[p]]+=lz[p];
}
cout<<ans<<'\n';
}
}sam;
int main(){
while(scanf("%d",&k),k){
scanf("%s",s+1),n=strlen(s+1),sam.init();
for(ri i=1;i<=n;++i)sam.expend(calc(s[i]));
scanf("%s",s+1),n=strlen(s+1),sam.query();
}
return 0;
}
2018.12.15 poj3415 Common Substrings(后缀自动机)的更多相关文章
- 2018.12.15 hdu4641 K-string(后缀自动机)
传送门 后缀自动机基础题. 题意简述:支持动态在串尾插入字符,查询在串中出现超过kkk次的子串的个数. 动态修改samsamsam,每次增量构造好了之后在parentparentparent树上从新建 ...
- POJ3415 Common Substrings —— 后缀数组 + 单调栈 公共子串个数
题目链接:https://vjudge.net/problem/POJ-3415 Common Substrings Time Limit: 5000MS Memory Limit: 65536K ...
- POJ3415 Common Substrings(后缀数组 单调栈)
借用罗穗骞论文中的讲解: 计算A 的所有后缀和B 的所有后缀之间的最长公共前缀的长度,把最长公共前缀长度不小于k 的部分全部加起来.先将两个字符串连起来,中间用一个没有出现过的字符隔开.按height ...
- poj3415 Common Substrings (后缀数组+单调队列)
Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 9414 Accepted: 3123 Description A sub ...
- 2018.12.22 bzoj3277: 串(后缀自动机+启发式合并)
传送门 跟这道题是一模一样的. 于是本蒟蒻又写了一遍10min1A庆祝 代码: #include<bits/stdc++.h> #define ri register int using ...
- 2018.12.22 bzoj3473: 字符串(后缀自动机+启发式合并)
传送门 调代码调的我怀疑人生. 启发式合并用迭代写怎么都跑不过(雾 换成了dfsdfsdfs版本的终于过了233. 题意简述:求给出nnn个字串,对于每个给定的字串求出其有多少个字串在至少kkk个剩下 ...
- Tencent Cloud Developers Conference(2018.12.15)
时间:2018.12.15地点:北京朝阳悠唐皇冠假日酒店
- 2018.12.15 spoj Substrings(后缀自动机)
传送门 后缀自动机基础题. 求长度为iii的子串出现次数的最大值. 对原串建出samsamsam,然后用sizsizsiz更新每个maxlenmaxlenmaxlen的答案. 然后由于后缀链接将其转化 ...
- 2018.12.15 spoj Longest Common Substring II(后缀自动机)
传送门 后缀自动机基础题. 给出10个串求最长公共子串. 我们对其中一个建一个samsamsam,然后用剩下九个去更新范围即可. 代码: #include<bits/stdc++.h> # ...
随机推荐
- httpclient使用用例
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...
- spring上下文快速获取方法
import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContex ...
- vue滚动行为控制——页面跳转返回上一个页面保留滚动位置
需求分析: 一般这个功能在后台管理系统用的比较多,因为后台页面都是在当前页面打开,对于某些列表筛选页,如果列表数据比较多,页面就会滚动.当页面发生滚动,对列表数据进行查看或者编辑的时候,跳转到下一级页 ...
- freetype教程网址
http://freetype.sourceforge.net/freetype2/docs/reference/ft2-system_interface.html#FT_Stream ht ...
- 【Linux 线程】常用线程函数复习《三》
1.关于函数pthraed_join与函数pthraed_detach 在任何一个时间点上,线程是可结合的(joinable)或者是分离的(detached).一个可结合的线程能够被其他线程收回其资源 ...
- tomcat 启动日志乱码
打开cd到tomcat/conf/目录下 修改logging.properties 找到 java.util.logging.ConsoleHandler.encoding = utf-8这行 更改为 ...
- Bootstrap(2) 排版样式
1.页面主体,Bootstrap 将全局 font-size 设置为 14px,line-height 行高设置为 1.428(即20px):<p>段落元素被设置等于 1/2 行高(即 1 ...
- MVC中Ajax post 和Ajax Get——提交对象
HTTP 请求:GET vs. POST两种在客户端和服务器端进行请求-响应的常用方法是:GET 和 POST.GET - 从指定的资源请求数据POST - 向指定的资源提交要处理的数据GET 基本上 ...
- MVC防止跨站攻击@Html.AntiForgeryToken()
ASP.NET MVC 中有个标签:@Html.AntiForgeryToken(),需要在页面中加入这个标签,然后在Actoin中加入特性[ValidateAntiForgeryToken]就可以了 ...
- Spring Boot学习笔记2——基本使用之最佳实践[z]
前言 在上一篇文章Spring Boot 学习笔记1——初体验之3分钟启动你的Web应用已经对Spring Boot的基本体系与基本使用进行了学习,本文主要目的是更加进一步的来说明对于Spring B ...