LGP5341题解
SAM一道很裸的题。。。
题意很明确,不再阐述。
做法很简单:找到所有出现次数为 \(k\) 的子串,然后统计。
怎么找到这些字符串呢?SAM 只能找出等价类啊。
注意 parent tree 的父亲节点的长度 +1 即该等价类中长度最短的字符串,那么若我们先通过拓扑排序求出每个等价类在原串中出现次次数 \(siz[u]\),该等价类的所有字符串都出现了 \(siz[u]\) 次,那么就变为了一个序列操作题:
- 区间加 \(1\)
- 查询前缀和
而所有 \(2\) 操作都在 \(1\) 操作之后,我们可以用 \(O(n)\) 的差分优秀地解决这个问题。
贴代码:
#include<cstring>
#include<cstdio>
const int M=1e5+5;
int T,n,k,tot=1,lst=1,sum[M],id[M<<1],CB[M<<1],siz[M<<1];char s[M];
struct Node{
int chi[26];
int f,len;
Node():f(0),len(0){memset(chi,0,104);}
}SAM[M<<1];
inline void Insert(const int&s){
int q,p,nq,np;
p=lst;np=lst=++tot;
SAM[np].len=SAM[p].len+1;siz[np]=1;
for(;p&&!SAM[p].chi[s];p=SAM[p].f)SAM[p].chi[s]=np;
if(!p)SAM[np].f=1;
else{
q=SAM[p].chi[s];
if(SAM[q].len==SAM[p].len+1)SAM[np].f=q;
else{
SAM[nq=++tot]=SAM[q];
SAM[np].f=SAM[q].f=nq;
SAM[nq].len=SAM[p].len+1;
for(;p&&SAM[p].chi[s]==q;p=SAM[p].f)SAM[p].chi[s]=nq;
}
}
}
inline int Solve(){
register int i,u,ans=n+1;
for(i=1;i<=tot;++i)++CB[SAM[i].len];
for(i=1;i<=tot;++i)CB[i]+=CB[i-1];
for(i=1;i<=tot;++i)id[CB[SAM[i].len]--]=i;
for(i=tot;i>=1;--i){
u=id[i];
siz[SAM[u].f]+=siz[u];
if(siz[u]==k)++sum[SAM[u].len],--sum[SAM[SAM[u].f].len];
}
for(i=n;i>=1;--i){
sum[i]+=sum[i+1];
if(sum[i]>sum[ans])ans=i;
}
ans=sum[ans]?ans:-1;
while(tot)id[tot]=CB[tot]=siz[tot]=0,SAM[tot--]=Node();
for(i=1;i<=n;++i)sum[i]=0;
tot=lst=1;
return ans;
}
signed main(){
register int i;
scanf("%d",&T);
while(T--){
scanf("%s%d",s,&k);n=strlen(s);
for(i=0;i<n;++i)Insert(s[i]-97),s[i]=0;
printf("%d\n",Solve());
}
}
LGP5341题解的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
随机推荐
- Android中四大组件
Activity BroadCast Receiver 广播接收者 Service 服务 Content Provider 内容提供者 四大组件都需要在清单文件里面配置一下
- Java中的常用的输入输出流
Java中的输入输出流根据格式又可以分为字节流和字符流:(成对) 字节流:FileInputStream,FileOutputStream : BufferedInputStream,Buffe ...
- 如何清除项目git版本控制信息
首先进入项目目录下 邮件打开 git bash here 执行命令 find . -name ".git" | xargs rm -rf 就清除了git版本控制信息
- 如何使Label显示时,一行顶部居中,两行靠左显示----董鑫
有时我们会碰到这种情况,一个要根据内容显示一行还是两行,一行时还要靠着顶部再居中,比如下面 最左边的名称,要求是靠上的,如果按照正常的方式写的话,可能一行的话就会出现居中显示了,不会顶着头部显示. 我 ...
- 使用GDataXML生成、修改XML文档-陈棚
使用GDXML生成XML文档的步骤如下. 1.调用GDataXMLNode的elementWithName:方法创建GDataXMLElement对象,对象作为XML文档的根元素. 2.调用GData ...
- ACM-ICPC 2015辽宁省赛
省赛之于ACM 就是让省内的队伍互相比较而已~~~(何况弱省(本渣校 四个二等四个三等(其实是六个三道题 两个两道题,是院长后来和主办方沟通了下- - (本弱很水,但还是要吐槽:好水的省赛啊!!
- 一键部署mysql 无修改直接cp 执行 100% 有效
一键部署mysql 无修改直接cp 执行 100% 有效 将安装包拖至/opt目录下,编一个脚本文件,然后source执行脚本,等脚本执行完成, 即可使用mysql -u root -p点击 ...
- Java判断是否是回文字符串
public static boolean isPalindrome(String str) { int start = 0, end = str.length() - 1; while (start ...
- 帆软报表(finereport)图表操作细节
图表间之间的组件间隔:body-->属性-->布局-->组件间隔 决策报表背景水印:body-->属性-->水印 仪表盘指针/枢纽/背景颜色:样式-->系列 柱形图 ...
- Solution -「AGC 029E」「AT 4504」Wandering TKHS
\(\mathcal{Description}\) Link. 给一棵 \(n\) 个点的树,从某个点出发,遍历时必须走到已经走过的连通块所邻接的编号最小的结点.求从每个点出发,走到 \(1\ ...