【洛谷P3804】统计每个子串出现的次数和长度(后缀自动机模版+拓扑序计数)
题目地址:https://www.luogu.org/problem/P3804
解题思路:
对于此题求拓扑序的两种方法:
(1)桶排序法:最终y[x]=i, 表示在拓扑序中第x个点是i
void _count(){memset(x,0,sizeof(x));for(int i=1;i<=cnt;i++) x[len[i]]++;for(int i=1;i<=cnt;i++) x[i]+=x[i-1];/for(int i=1;i<=cnt;i++) y[x[len[i]]--]=i;for(int i=cnt;i>=1;i--)cnt[link[y[i]]]+=cnt[y[i]];}
(2)dfs
vector<int> v[MAXN];
LL ans = 0;
for(int i = 2; i <= tot; i++) v[link[i]].push_back(i);
void dfs(int x) {for(int i = 0; i < v[x].size(); i++)dfs(v[x][i]), cnt[x] += cnt[v[x][i]];if(siz[x] > 1) ans = max(ans, 1ll * cnt[x] * maxlen[x]);
}
例如字符串aabbabd,建立的SAM和拓扑序(红色箭头路线)为:
图源:https://www.cnblogs.com/zjp-shadow/p/9218214.html
ac代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn = 1e6+100;
int maxlen[maxn<<1], trans[maxn<<1][30], link[maxn<<1];
int x[maxn<<1], y[maxn<<1], cnt[maxn<<1];
int num, last;//num表示状态数
char s[maxn];
void init()
{num = last = 1;//起始状态的编号为1maxlen[last] = link[last] = 0;//起始位置为空字符,长度为0
}
void insert(int id)
{int z = ++num, p;maxlen[z] = maxlen[last]+1;for(p = last; p && !trans[p][id]; p = link[p]) trans[p][id] = z;if(!p) link[z] = 1;//路径上不存在跳转else//连接路径上已存在跳转{int x = trans[p][id];//第一个存在跳转的状态跳转去的状态if(maxlen[x] == maxlen[p]+1) link[z] = x;//一个else//多个{int y = ++num;maxlen[y] = maxlen[p]+1;memcpy(trans[y], trans[x], sizeof(trans[x]));link[y] = link[x];for(; p && trans[p][id] == x; p = link[p]) trans[p][id] = y;link[x] = link[z] = y;}}last = z;cnt[z] = 1;
}
void count()
{memset(x, 0, sizeof x);for(int i = 1; i <= num; i++) x[maxlen[i]]++;for(int i = 1; i <= num; i++) x[i] += x[i-1];for(int i = 1; i <= num; i++) y[x[maxlen[i]]--] = i;for(int i = num; i >= 1; i--)cnt[link[y[i]]] += cnt[y[i]];
}
int main()
{scanf("%s", s);int len = strlen(s);init();for(int i = 0; i < len; i++) insert(s[i]-'a');count();ll ans = 0;for(int i = 1; i <= num; i++)if(cnt[i] > 1)ans = max(ans, 1ll*maxlen[i]*cnt[i]);printf("%lld\n", ans);return 0;
}
【洛谷P3804】统计每个子串出现的次数和长度(后缀自动机模版+拓扑序计数)相关推荐
- 洛谷P1567 统计天数
洛谷P1567 统计天数 题目 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 分析 CODE 题目 题目描述 炎热的夏日,KC 非常的不爽.他宁可忍受北 ...
- 7-6 统计字符串中数字字符的个数_洛谷 || 标题统计(C语言)
点击上方「蓝字」关注"程序员Bob" 每天与你不见不散! 每日一句,送给最珍贵的你: Happy people focus on what they have, unhappy p ...
- 洛谷——P1567 统计天数
P1567 统计天数 题目描述 炎热的夏日,KC 非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续 N ...
- 洛谷 P1567 统计天数
题目描述 炎热的夏日,KC 非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续 N(≤106)的最高气温 ...
- Java 洛谷 P1308 统计单词数
题目链接:https://www.luogu.com.cn/problem/P1308 代码实例: import java.util.Scanner; public class Main{public ...
- 洛谷 - P1308 统计单词数(字符串+模拟)
题目链接:点击查看 题目大意:给出一个字符串a和字符串b,现在问字符串b中有多少个单词与字符串a相等,并记录第一次出现的位置 题目分析:看似很简单的一个模拟题,其实包含了不少需要注意的地方: stri ...
- 数组——洛谷#P1567 统计天数(Python实现)
题目描述 炎热的夏日,KC 非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续 N(1≤N≤106) 的 ...
- c语言--洛谷p1308统计单词数
//这道题思路是借鉴别人的 #include<stdio.h> #include<string.h> int main(){char a[11];char b[1000000] ...
- hash:奶牛看地图(洛谷P3405 [USACO16DEC]Cities and States S)
洛谷传送门 解析 其实就是每组2个长度为2的字符串统计交叉相等的个数 每个序列可以用一个26进制的数来表示,总要加个标签,勉强算hash..(想叫<水题> ) 最大值为26*26(ZZ) ...
- 洛谷日报 2020年3月前索引
2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https://www.luo ...
最新文章
- 3306 端口 要不要修改_zabbix 自动发现并监控所有端口
- 图的割点(边表集实现)
- Mono.Cecil C#代码注入
- Spring重写BeanDefinitionRegistryPostProcessors进行扩展
- asp.net webapi 微信接口接入
- Java基础语法十二 泛型程序设计
- CodeForces - 1252E Songwriter(贪心)
- facelets_不要在facelets中重复表情
- Apache Cassandra 在 Facebook 的应用
- 【实战项目】采用jeecg3.2框架,一个人写的购物系统
- LinuxCNC基础知识
- RabbitMq学习笔记006---修改RabbitMq端口号和心跳时间
- do-while语句和while的区别
- 最大生成树算法matlab,基于最大生成树的社团划分算法
- 无线路由器设置成交换机
- 鸿蒙开发实例|构建轻量级智能穿戴设备用户界面
- matlab清除坐标轴,matlab 使用技巧之设置坐标轴
- 【Python】Base64编码和解码
- 智能家居加速落地,景联文科技提供数据采集标注服务
- 【起航计划ObjC 003】印第安老斑鸠ObjC的幻想 ---- ObjC经典问题
热门文章
- 蓝桥杯 算法训练 数的潜能 正整数分解使得乘积最大问题
- 【Docker】06 DockerFile
- 禁止php读取目录文件目录,Php读取目录文件
- PHP分类输出代码,PHP无限分类代码,支持数组格式化、直接输出菜单两种方式_php技巧...
- 如何实现手动指定AOP实现JDK代理模式到CGLIB的更改?
- java ocx调用_Javascript调用OCX控件
- c++ascii表_几道和散列(哈希)表有关的面试题
- android实战技巧,实战技巧:Android异步指南
- win10自带sftp服务器_用于Windows系统的免费SFTP服务器-Free SFTP Servers及各款软件功能对比...
- Hashtable 数据遍历的几种方式