sam_code

news/2024/11/28 21:50:40/文章来源:https://www.cnblogs.com/guidingstar/p/18575322

802I_本质不同字串出现次数平方和

NAME MeIoN_is_UMP45() {string s;std::cin >> s;const int n = s.length();SAM sam(n << 1);vector<int> sz(n << 1);for (int pla = 0; const char c : s) {pla = sam.ext(pla, c - 'a');sz[pla] = 1;}vector<vector<int>> v(n << 1);for (int i = 1; i < sam.size(); ++i) {v[sam[i].link].emplace_back(i);}meion dfs = [&](meion &&se, int n) -> void {for (const int i : v[n]) {se(se, i);sz[n] += sz[i];}};dfs(dfs, 0);ll ans = 0;for (int i = 1; i < sam.size(); ++i) {ans += 1ll * sz[i] * sz[i] * (sam[i].len - sam[sam[i].link].len);}std::cout << ans << '\n';
}

多个串的最长公共字串

NAME MeIoN_is_UMP45() {string s, ss;std::cin >> s;const int n = s.length();array<SAM, 11> sam;int tot = 0;while (std::cin >> ss) {for (int pla = 0; const char c : ss) {pla = sam[tot].ext(pla, c - 'a');}++tot;}vector<int> slen(n, inf<int>);for (int i = 0; i < tot; ++i) {int pla = 0, plen = 0;meion &sa = sam[i];for (int i = 0; const char c : s) { if (sa[pla][c - 'a'] == -1) {while (pla != 0 and sa[pla][c - 'a'] == -1) {pla = sa[pla].link;}plen = sa[pla].len;}if (sa[pla][c - 'a'] != -1) {pla = sa[pla][c - 'a'];++plen;}chmin(slen[i++], plen);}}std::cout << qmax(slen) << '\n';
}

两个子串相同的方案数

NAME MeIoN_is_UMP45() {string s, ss;std::cin >> s >> ss;const int n = s.length(), m = ss.length();SAM sam(n + m << 1);vector<int> sz(n + m << 1), szz(sz);// 建立广义sam 暴算for (int pla = 0; char c : s) {pla = sam.ext(pla, c - 'a');sz[pla] = 1;}for (int pla = 0; char c : ss) {pla = sam.ext(pla, c - 'a');szz[pla] = 1;}vector<vector<int>> v(sam.size());for (int i = 1; i < sam.size(); ++i) {v[sam[i].link].emplace_back(i);}ll ans = 0;meion dfs = [&](meion &&se, int n) -> void {for (int i : v[n]) {se(se, i);sz[n] += sz[i];szz[n] += szz[i];ans += 1ll * sz[i] * szz[i] * (sam[i].len - sam[n].len);}};dfs(dfs, 0);std::cout << ans << '\n';
}

P_2408_不同子串个数

NAME MeIoN_is_UMP45() {int n;string s;std::cin >> n >> s;SAM sam(n << 1);for (int pla = 0; const char c : s) {pla = sam.ext(pla, c - 'a');}ll ans = 0;// 每个pos存着所有结束pos相同的子串集合, len为最长字串, link_pos的最长字串length为// pos的 最短字串 的length - 1for (int i = 1; i < sam.size(); ++i) {// 最长len - 最短len + 1 为串数量ans += sam[i].len - sam[sam[i].link].len;}std::cout << ans << '\n';
}

P_3804_模板_后缀自动机_SAM

NAME MeIoN_is_UMP45() {string s;std::cin >> s;const int n = s.length();SAM sam(n << 1);vector<int> sz(n << 1);for (int pla = 0; const char c : s) {pla = sam.ext(pla, c - 'a');sz[pla] = 1;}vector<vector<int>> v(sam.size());for (int i = 1; i < sam.size(); ++i) {v[sam[i].link].emplace_back(i);}ll ans = 0;meion dfs = [&](meion &&se, int n) -> void {for (const int i : v[n]) {se(se, i);sz[n] += sz[i];}if (sz[n] > 1) chmax(ans, 1ll * sz[n] * sam[n].len);};dfs(dfs, 0);std::cout << ans << '\n';
}

P_3975_TJOI_2015_弦论

NAME MeIoN_is_UMP45() {string s;int t, k;std::cin >> s >> t >> k;const int n = s.length();SAM sam;vector<int> sz(n << 1);for (int pla = 0; const char c : s) {pla = sam.ext(pla, c - 'a');sz[pla] = 1;}vector<vector<int>> v(n << 1);for (int i = 1; i < sam.size(); ++i) {v[sam[i].link].emplace_back(i);}meion dfs = [&](meion &&se, int n) -> void {for (int i : v[n]) {se(se, i);sz[n] += sz[i];}if (not t) sz[n] = 1;};dfs(dfs, 0);sz[0] = 0;vector<uint8_t> vis(n << 1);vector<ll> dp(n << 1);meion go = [&](meion &&se, int n) -> void {if (vis[n]) iroha;vis[n] = 1;dp[n] = sz[n];for (int i = 0, x; i < 26; ++i) {x = sam[n][i];if (x == -1) continue;se(se, x);dp[n] += dp[x];}};go(go, 0);int pla = 0;if (dp[pla] < k) iroha std::cout << "-1\n", void();string ans;while (k > 0) {for (int i = 0, x; i < 26; ++i) {x = sam[pla][i];if (x == -1) continue;if (k > dp[x]) {k -= dp[x];} else {pla = x;k -= sz[pla];ans += char('a' + i);break;}}}std::cout << ans << '\n';
}

s[l, r]与t的最长公共字串(Olog_/_O1)

NAME MeIoN_is_UMP45() {string s, t;int q;std::cin >> s >> t >> q;SAM sam;meion [sz, v] = sam.build(t);const int n = s.length();vector<int> slen(n, inf<int>);for (int i = 0, pla = 0, plen = 0; const char c : s) {if (sam[pla][c - 'a'] == -1) {while (pla != 0 and sam[pla][c - 'a'] == -1) {pla = sam[pla].link;}plen = sam[pla].len;}if (sam[pla][c - 'a'] != -1) {pla = sam[pla][c - 'a'];++plen;}chmin(slen[i++], plen);}sqrt_tree<monoid_max<int>> table(slen);for (int i = 0, l, r, m, S; i < q; ++i) {std::cin >> l >> r, --l;m = binary_search([&](int x) -> bool {if (x == r) iroha true;iroha x - slen[x] + 1 > l - 1;}, r, l - 1);if (m == r) std::cout << r - l << '\n';else std::cout << std::max(table.prod(m, r), m - l) << '\n';}
}

s的循环在t的几个字串中出现

NAME MeIoN_is_UMP45() {string s;std::cin >> s;SAM sam;meion [sz, v] = sam.build(s);static bitset<2000001> vis;int q;std::cin >> q;for (int i = 0; i < q; ++i) {std::cin >> s;vis.reset();const int n = s.length();int slen = 0, pla = 0;for (const char c : s) {while (pla != 0 and sam[pla][c - 'a'] == -1) {pla = sam[pla].link;slen = sam[pla].len;}if (sam[pla][c - 'a'] != -1) {pla = sam[pla][c - 'a'];++slen;}}ll ans = 0;for (int i = 0; i < n; ++i) {if (slen == n) {if (not vis[pla]) {ans += sz[pla];}vis[pla] = 1;--slen;if (slen == sam[sam[pla].link].len) {pla = sam[pla].link;}}while (pla != 0 and sam[pla][s[i] - 'a'] == -1) {pla = sam[pla].link;slen = sam[pla].len;}if (sam[pla][s[i] - 'a'] != -1) {pla = sam[pla][s[i] - 'a'];++slen;}}std::cout << ans << '\n';}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/843099.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【java编程】Unsafe 类

Unsafe 类不是一个 ClassLoader, 但是为什么要在本篇文章提起, 其实是因为该类可以进行注入恶意类到 JVM 中. Unsafe 类简介 sun.misc.Unsafe 类是一个提供底层、不安全的操作,比如直接内存访问、线程调度、原子操作等功能的工具类。 这个类主要被Java内部库使用,比如Java的…

山体落石泥石流自动监测摄像机

山体落石泥石流自动监测摄像机捕获的图像数据将对图像进行分析,山体落石泥石流自动监测摄像机识别出山体的位移、裂缝、滑坡等异常现象。算法的训练需要大量的山体图像数据,包括正常和异常状态的图像,以确保其识别的准确性。一旦AI系统识别出山体失稳的迹象,它会立即触发报…

【java编程】Xalan ClassLoader

Xalan 是 Java 中用于操作 XML 的一个库,它是 Apache XML 项目的一部分,主要用于将 XSLT(Extensible Stylesheet Language Transformations)转换为可执行代码,从而实现XML文档的转换。 XSLT 的理解 当然了, 我们先理解该模块如何使用之后, 我们再研究它的妙用, XSLT 说白了…

[游记]CSP2024 游记

这是一篇迟到的游记,为什么呢?因为作者已经成为文化课选手了。 Day-1 晚上 \(6:00\) 到了宾馆,在路上准备了一下面基事宜。在车上昏昏沉沉,结果下了车精神抖擞了。 简单布置之后开始摆烂,这是符合考前规范的好事。某游戏连跪十五局。rp -- 。我希望这是给我第二天攒 rp。 …

[笔记]动态规划优化(斜率优化,决策单调性优化)

本文主要记录某些动态规划思路及动态规划优化。 首先先把以前写过的斜率优化祭出来。 斜率优化 \(\text{P5017 [NOIP2018 普及组] 摆渡车}\) 经典例题。 设 \(f_i\) 表示最后班车在 \(i\) 时刻发车,所有人等待时间和的最小值。(这里的所有人是指到达时刻小于等于 \(i\) 的所有…

基于Java+SpringBoot+Mysql实现的点卡各种卡寄售平台功能设计与实现一

后台功能:寄售管理、提现管理、订单管理、认证管理、公告管理、用户管理等。 该系统总共21张表,代码整洁,每个功能、接口上都有注释说明。 部分功能:前台用户信息实体类Entity、实名认证信息实体类Entity、银行卡类型信息实体类Entity、寄售卡类型信息实体类Entity、寄售卡…

【java编程】BCEL ClassLoader

BCEL 介绍 BCEL的全名应该是Apache Commons BCEL,属于Apache Commons项目下的一个子项目。Apache Commons大家应该不陌生,反序列化最著名的利用链就是出自于其另一个子项目——Apache Commons Collections。 BCEL库提供了一系列用于分析、创建、修改Java Class文件的API。就…

借助电脑探究双变量函数问题侧记

记录一次借助电脑探究双变量函数问题的全过程前情概要 偶尔看到下面的习题,想到以前自己整理的双变量函数问题,尝试练手时发现,寻找思路不是很简单的问题,探索一番,对整个过程作以记录,成篇为一侧记 . 典型案例 【2025届高三数学月考3第12题】对于函数 \(f(x)=e^x-x^2+a\…

Paypal最新版本 paypal-server-sdk 使用案例(前端 Vue3 + 后端Spring Boot )

背景 在项目中对接Paypal支付,一开始在网上查了好久,发现资料少,而且陈旧,甚至我都没弄清楚我应该哪个SDK。 我到 maven 中央仓库中,搜索 com.paypal.sdk,能查出不少结果,据我所知,至少有三个sdk可以从后端访问到Paypal:paypal-core:非常陈旧,2016年就停止更新了,但…

【java编程】URLClassLoader

从上面我们研究【java编程】双亲委派模式时进行Debug了源代码, 可以发现的是, URLClassLoader是ExtClassLoader && AppClassLoader的父类(不是父亲), public class Launcher {static class ExtClassLoader extends URLClassLoader {}static class AppClassLoader exten…

秒杀系统

前言 秒杀大家都不陌生。自2011年首次出现以来,无论是双十一购物还是 12306 抢票,秒杀场景已随处可见。简单来说,秒杀就是在同一时刻大量请求争抢购买同一商品并完成交易的过程。从架构视角来看,秒杀系统本质是一个高性能、高一致、高可用的三高系统。而打造并维护一个超大…

.NET周刊【11月第4期 2024-11-24】

国内文章 C# 入门深度学习:万字长文讲解微积分和梯度下降 https://www.cnblogs.com/whuanle/p/18551532 这篇文章主要介绍了使用 C# 进行深度学习的方法,特别是微积分在此领域的应用。作者简要讲解了极限、导数等基本概念,并展示了如何在 C# 中实现这些数学运算,例如将一个…