2018.12.22 bzoj3277: 串(后缀自动机+启发式合并)
传送门
跟这道题是一模一样的。
于是本蒟蒻又写了一遍10min1A庆祝
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
const int N=2e5+5;
typedef long long ll;
int T,k;
string s[N];
struct SAM{
int last,tot,len[N],son[N][26],link[N],val[N];
vector<int>e[N];
set<int>S[N];
SAM(){last=tot=1,len[0]=-1,fill(son[0],son[0]+26,1);}
inline void expand(int x,int id){
int p=last,np=++tot;
S[last=np].insert(id),len[np]=len[p]+1;
while(!son[p][x])son[p][x]=np,p=link[p];
if(!p){link[np]=1;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],link[q]=link[np]=nq;
while(son[p][x]==q)son[p][x]=nq,p=link[p];
}
inline void merge(int x,int y){
if(S[x].size()<S[y].size())swap(S[x],S[y]);
for(set<int>::iterator it=S[y].begin();it!=S[y].end();++it)S[x].insert(*it);
}
inline void dfs(int p){for(ri i=0;i<e[p].size();++i)dfs(e[p][i]),merge(p,e[p][i]);val[p]=S[p].size();}
inline void solve(){for(ri i=1;i<=tot;++i)if(link[i])e[link[i]].push_back(i);dfs(1);}
inline ll query(int id){
int p=1,up=s[id].size();
ll ret=0;
for(ri i=0;i<up;++i){
p=son[p][s[id][i]-'a'];
while(val[p]<k)p=link[p];
ret+=len[p];
}
return ret;
}
}sam;
int main(){
scanf("%d%d",&T,&k);
if(k>T){for(ri i=1;i<=T;++i)cout<<"0 ";return 0;}
for(ri i=1,n;i<=T;++i){
cin>>s[i],n=s[i].size();
for(ri j=0;j<n;++j)sam.expand(s[i][j]-'a',i);
sam.last=1;
}
sam.solve();
for(ri i=1;i<=T;++i)cout<<sam.query(i)<<' ';
return 0;
}
2018.12.22 bzoj3277: 串(后缀自动机+启发式合并)的更多相关文章
- 2018.12.22 bzoj3473: 字符串(后缀自动机+启发式合并)
传送门 调代码调的我怀疑人生. 启发式合并用迭代写怎么都跑不过(雾 换成了dfsdfsdfs版本的终于过了233. 题意简述:求给出nnn个字串,对于每个给定的字串求出其有多少个字串在至少kkk个剩下 ...
- loj#6041. 「雅礼集训 2017 Day7」事情的相似度(后缀自动机+启发式合并)
题面 传送门 题解 为什么成天有人想搞些大新闻 这里写的是\(yyb\)巨巨说的启发式合并的做法(虽然\(LCT\)的做法不知道比它快到哪里去了--) 建出\(SAM\),那么两个前缀的最长公共后缀就 ...
- BZOJ 2946: [Poi2000]公共串( 后缀自动机 )
一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...
- bzoj 2946 [Poi2000]公共串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...
- 【bzoj2946】[Poi2000]公共串 后缀自动机
[Poi2000]公共串 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1386 Solved: 620[Submit][Status][Discus ...
- BZOJ 2946 [Poi2000]公共串 ——后缀自动机
任意选择一个串作为模式串,构建出后缀自动机. 然后用其他的串在后缀自动机上跑匹配. 然后就到了理解后缀自动机性质的时候. 在某一个节点的最大值是可以沿着parent树上传的. 然后用dp[i][j]表 ...
- bzoj 2946 公共串 —— 后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 建出 n-1 个后缀自动机一起跑呗. 代码如下: #include<cstdio ...
- LOJ#6503.「雅礼集训 2018 Day4」Magic[容斥+NTT+启发式合并]
题意 \(n\) 张卡牌 \(m\) 种颜色,询问有多少种本质不同的序列满足相邻颜色相同的位置数量等于 \(k\). 分析 首先本质不同不好直接处理,可以将同种颜色的卡牌看作是不相同的,求出答案后除以 ...
- 2018.12.22 spoj7258 Lexicographical Substring Search(后缀自动机)
传送门 samsamsam基础题. 题意简述:给出一个串,询问第kkk大的本质不同的串. 然而这就是弦论的简化版. 我们把samsamsam建出来然后贪心选择就行了. 代码: #include< ...
随机推荐
- 微信小程序开发-rem转换rpx小工具
实现原理: 对样式进行格式化,然后根据 “rem” 进行拆分,这样就会拆分成一个数组 [str1,str2,str3...,str6], 除了最后一个元素,前边的元素都会以 “rem” 样式的数值结尾 ...
- TZOJ 4871 文化之旅(floyd预处理+dfs剪枝)
描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次,即如果他学习了某种文化,则他就不能到达其他有这种文化的国家.不同的国家可能有相同的文化.不同文化的国家 ...
- Delphi: TGraphicControl支持PaintTo方法
Delphi之TWinControl支持PaintTo方法,可以方便的Paint有句柄控件,而此方法,TGraphicControl没有. 这使得有时需要Paint无句柄控件诸如TLabel时颇为费事 ...
- c#: 以模态窗口显示于其它进程窗体之前
产品之工具箱,需要工具以模态窗体,显示于主界面之上.记下代码点,以做备忘. 1.IWin32Window internal class Win32Window : IWin32Window { pub ...
- Android studio实现简单的CRUD
1.打开Android studio ,创建项目DataBase01 2.进行UI设计,如图 目的:实现对姓名及其爱好的增删改查 3.创建DB.java,用于创建数据库,并做相关操作 在该目录下右键- ...
- 数据库存储 datetime,时差问题
var offset = moment().utcOffset(); var localText = moment.utc(datetime from database).utcOffset(offs ...
- Bootstrap(6)图标菜单按钮组件
一.小图标组件 Bootstrap 提供了免费的 263 个小图标(数了两次),具体可以参考中文官网的组件链接:http://v3.bootcss.com/components/#glyphicons ...
- 类似No module named 'bs4'等错误的解决方法
最近开始接触爬虫,写了如下源代码: from bs4 import BeautifulSoup import requests url='https://www.tripadvisor.cn/Attr ...
- Fiddler抓包使用教程-安装配置
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/72876628 本文出自[赵彦军的博客] Fiddler是什么? Fiddler是一 ...
- C#设计模式-1简单工厂模式Simple Factory)
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 简单的工 ...