题目地址: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】统计每个子串出现的次数和长度(后缀自动机模版+拓扑序计数)相关推荐

  1. 洛谷P1567 统计天数

    洛谷P1567 统计天数 题目 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 输出样例#1: 分析 CODE 题目 题目描述 炎热的夏日,KC 非常的不爽.他宁可忍受北 ...

  2. 7-6 统计字符串中数字字符的个数_洛谷 || 标题统计(C语言)

    点击上方「蓝字」关注"程序员Bob" 每天与你不见不散! 每日一句,送给最珍贵的你: Happy people focus on what they have, unhappy p ...

  3. 洛谷——P1567 统计天数

    P1567 统计天数 题目描述 炎热的夏日,KC 非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续 N ...

  4. 洛谷 P1567 统计天数

    题目描述 炎热的夏日,KC 非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续 N(≤106)的最高气温 ...

  5. Java 洛谷 P1308 统计单词数

    题目链接:https://www.luogu.com.cn/problem/P1308 代码实例: import java.util.Scanner; public class Main{public ...

  6. 洛谷 - P1308 统计单词数(字符串+模拟)

    题目链接:点击查看 题目大意:给出一个字符串a和字符串b,现在问字符串b中有多少个单词与字符串a相等,并记录第一次出现的位置 题目分析:看似很简单的一个模拟题,其实包含了不少需要注意的地方: stri ...

  7. 数组——洛谷#P1567 统计天数(Python实现)

    题目描述 炎热的夏日,KC 非常的不爽.他宁可忍受北极的寒冷,也不愿忍受厦门的夏天.最近,他开始研究天气的变化.他希望用研究的结果预测未来的天气. 经历千辛万苦,他收集了连续 N(1≤N≤106) 的 ...

  8. c语言--洛谷p1308统计单词数

    //这道题思路是借鉴别人的 #include<stdio.h> #include<string.h> int main(){char a[11];char b[1000000] ...

  9. hash:奶牛看地图(洛谷P3405 [USACO16DEC]Cities and States S)

    洛谷传送门 解析 其实就是每组2个长度为2的字符串统计交叉相等的个数 每个序列可以用一个26进制的数来表示,总要加个标签,勉强算hash..(想叫<水题> ) 最大值为26*26(ZZ) ...

  10. 洛谷日报 2020年3月前索引

    2020 2019 2018 感觉洛谷日报全是干货!!!先记下来再说 2020 年洛谷日报索引 3 月 #260[dove]Church 编码(和 Lambda 演算) https://www.luo ...

最新文章

  1. 3306 端口 要不要修改_zabbix 自动发现并监控所有端口
  2. 图的割点(边表集实现)
  3. Mono.Cecil C#代码注入
  4. Spring重写BeanDefinitionRegistryPostProcessors进行扩展
  5. asp.net webapi 微信接口接入
  6. Java基础语法十二 泛型程序设计
  7. CodeForces - 1252E Songwriter(贪心)
  8. facelets_不要在facelets中重复表情
  9. Apache Cassandra 在 Facebook 的应用
  10. 【实战项目】采用jeecg3.2框架,一个人写的购物系统
  11. LinuxCNC基础知识
  12. RabbitMq学习笔记006---修改RabbitMq端口号和心跳时间
  13. do-while语句和while的区别
  14. 最大生成树算法matlab,基于最大生成树的社团划分算法
  15. 无线路由器设置成交换机
  16. 鸿蒙开发实例|构建轻量级智能穿戴设备用户界面
  17. matlab清除坐标轴,matlab 使用技巧之设置坐标轴
  18. 【Python】Base64编码和解码
  19. 智能家居加速落地,景联文科技提供数据采集标注服务
  20. 【起航计划ObjC 003】印第安老斑鸠ObjC的幻想 ---- ObjC经典问题

热门文章

  1. 蓝桥杯 算法训练 数的潜能 正整数分解使得乘积最大问题
  2. 【Docker】06 DockerFile
  3. 禁止php读取目录文件目录,Php读取目录文件
  4. PHP分类输出代码,PHP无限分类代码,支持数组格式化、直接输出菜单两种方式_php技巧...
  5. 如何实现手动指定AOP实现JDK代理模式到CGLIB的更改?
  6. java ocx调用_Javascript调用OCX控件
  7. c++ascii表_几道和散列(哈希)表有关的面试题
  8. android实战技巧,实战技巧:Android异步指南
  9. win10自带sftp服务器_用于Windows系统的免费SFTP服务器-Free SFTP Servers及各款软件功能对比...
  10. Hashtable 数据遍历的几种方式