poj 3294 不小于 k 个字符串中的最长子串(后缀数组+二分)

LeetCode 至少有K个重复字符的最长子串 找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。 示例 1: 输入: s = "aaabb", k = 3 输出: 3 最长子串为 "aaa" ,其中 'a' 重复了 3 次。 示例 2: 输入: s = "ababbc", k = 2 输出: 5 最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 ... 阅读详情

题目:http://poj.org/problem?id=3294
题意:

给定 n 个字符串,求出现在大于一半个字符串中的最长子串。

分析:

将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,将后缀分成若干组,判断每组的后缀是否出现在不小于 k 个的原串中。这个做法的时间复杂度为 O(nlogn)。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll;
const int INF = 1e9 + 9;
const int N = 2e5 + 9;

/********************倍增算法*后缀数组模板*******************************/

int sa[N], t1[N], t2[N], c[N], rk[N], height[N];
void build_sa (int s[], int n, int m) {
    int i, k, p, *x = t1, *y = t2;
    for (i = 0; i < m; i++) c[i] = 0;
    for (i = 0; i < n; i++) c[x[i] = s[i]]++;
    for (i = 1; i < m; i++) c[i] += c[i - 1];
    for (i = n - 1; i >= 0; i--) sa[--c[x[i]]] = i;
    for (k = 1; k <= n; k <<= 1) {
        p = 0;
        for (i = n - k; i < n; i++) y[p++] = i;
        for (i = 0; i < n; i++) if (sa[i] >= k) y[p++] = sa[i] - k;
        for (i = 0; i < m; i++) c[i] = 0;
        for (i = 0; i < n; i++) c[x[y[i]]]++;
        for (i = 1; i < m; i++) c[i] += c[i - 1];
        for (i = n - 1; i >= 0; i--) sa[--c[x[y[i]]]] = y[i];
        swap (x, y);
        p = 1;
        x[sa[0]] = 0;
        for (i = 1; i < n; i++)
            x[sa[i]] = y[sa[i - 1]] == y[sa[i]] && y[sa[i - 1] + k] == y[sa[i] + k] ? p - 1 : p ++;
        if (p >= n) break;
        m = p;
    }
}
void getHeight (int s[], int n) {
    int i, j, k = 0;
    for (i = 0; i <= n; i++) rk[sa[i]] = i;
    for (i = 0; i < n; i++) {
        if (k) k--;
        j = sa[rk[i] - 1];
        while (s[i + k] == s[j + k]) k++;
        height[rk[i]] = k;
    }
}
/********************************************************************************/


int s[N], n, m, length[N], tot, ans[N];
bool flag[111];
char str[N];
int check (int x) { //判断在哪个字符串中
    for (int i = 0; i < m; i++)
        if (x < length[i]) return i;
}
bool ok (int k) {
    tot = 0;
    int cnt = 0;
    for (int i = 1; i <= n; i++) {
        if (height[i] < k) {
            if (cnt > (m ) / 2) ans[tot++] = i - 1; //ans保存出现次数大于一半的字符串的一个后缀,然后再根据长度计算出字符串
            cnt = 0;
            memset (flag, 0, sizeof (flag) );
            continue;
        }
        if (cnt == 0) {
            flag[check (sa[i - 1])] = 1;
            cnt++;
        }
        int id = check (sa[i]);
        if (!flag[id]) flag[id] = 1, cnt++;
    }
    return tot > 0;
}
int main() {
    //freopen ("f.txt", "r", stdin);
    int cas = 0;
    while (~scanf ("%d", &m) && m ) {
        if (cas++) printf ("\n");
        int XX = 30;
        n = 0;
        for (int i = 0; i < m; i++) {
            scanf ("%s", str);
            int len = strlen (str);
            for (int j = 0; j < len; j++) s[n++] = str[j] - 'a' + 1;
            s[n++] = XX++; //每个字符串后面插入一个不同的符号
            length[i] = n;
        }
        if (m == 1) { //测试数据中没有m=1
            puts ("?");
            continue;
        }
        s[n] = 0;
        build_sa (s, n + 1, 150);
        getHeight (s, n);

        int l = 0, r = n;
        while (l < r) { //二分长度
            int mid = l + (r - l + 1) / 2;
            if (ok (mid) ) l = mid;
            else r = mid - 1;
        }
        ok (l);
        if (tot == 0) puts ("?");
        else
            for (int i = 0; i < tot; i++) {
                for (int j = sa[ans[i]]; j < sa[ans[i]] + l; j++)
                    printf ("%c", (char) (s[j] + 'a' - 1) );
                printf ("\n");
            }
    }
    return 0;
}
/*
Sample Input

3
abcdefg
bcdefgh
cdefghi
3
xxx
yyy
zzz
0

Sample Output

bcdefg
cdefgh

?


*/
AGI 之 【Dify】 之 Dify 在 Windows 端本地部署调用 Ollama 本地下载的大模型, API 形式 Python 调用 进行简单聊天接口测试 AGI,即通用人工智能(Artificial General Intelligence),是一种具备人类智能水平的人工智能系统。它不仅能够执行特定的任务,而且能够理解、学习和应用知识于广泛的问题解决中,具有较高的自主性和适应性。AGI的能力包括但不限于自我学习、自我改进、自我调整,并能在没有人为干预的情况下解决各种复杂问题。本节将介绍如何使用 Dify 平台调用 Ollama 部署的本地模型来创建一个聊天应用。通过 API 的方式发起聊天,可以让前端自由布置所需的聊天形式。 阅读详情

相关推荐

VSCode玩转Arduino:手把手解决‘未定义Serial’和头文件找不到的坑

本文详细介绍了在VSCode中配置Arduino开发环境时遇到的‘未定义Serial’和头文件找不到问题的解决方案。通过修改c_cpp_properties.json文件、调整IntelliSense引擎设置以及添加正确的库路径,开发者可以高效解决这些常见错误,提升开发体验。文章还提供了针对不同开发板和平台的高级配置技巧,确保配置的长期有效性。

weixin_42620202的博客 359

POJ 3294 后缀数组:求不小于k个字符串中的最长子串

思路:先把所有的串连接成一个串,串写串之前用没出现过的字符隔开,然后求后缀;对height数组分组二分求得最长的公共前缀,公共前缀所在的串一定要是不同的,不然就不是所有串的公共前缀了,然后记下下标和长度即可。 刚开始理解错题意,然后不知道怎么写,然后看别人题解也不知道怎么意思,后面看了好久才知道题目意思理解错了。 时间四千多ms,别人才一百多ms,不知道别人怎么做的…… #include #

liwei的专栏 781

数学文化赏析MOOC笔记【2023】

深圳大学UOOC课程《数学文化赏析》课程笔记

simplenthpower的博客 1753

【poj3294-不小于k个字符串中最长公共子串】后缀数组

【poj3294-不小于k个字符串中最长公共子串】后缀数组 1.注意每两个串之间的连接符要不一样。 2.分组的时候要注意最后一组啊!又漏了! 3.开数组要考虑连接符的数量。100010是不够的至少要101000。 1 #include&lt;cstdio&gt; 2 #include&lt;cstdlib&gt; ...

qq_25768269的博客 289

Codex VS Claude Code 全面测评!代码开发到底选谁?

评测结果6项指标(设计质量、提示遵从度、响应式、代码质量、细节关注、惊喜度)虽未公布最终赢家,但实测本身已揭示两工具在前端任务上的直接差异。Codex基于OpenAI的云沙箱架构,API通过全球CDN分发,但在国内直连时,依赖特定网络环境。:纯终端工具,直接在你的iTerm或终端中运行,不新建窗口、不切换上下文,与本地开发环境无缝融合。GPT-5.3 Codex(xhigh)输入$1.75/百万token,输出$14.00/百万token,混合均价约**$4.81/百万token**。

Jedudu的博客 3084

ADB命令解锁Android手机屏幕的3种实用方法(附详细步骤)

本文详细介绍了在Android手机屏幕失灵或密码遗忘时,利用ADB命令解锁屏幕的三种实用方法。包括通过ADB模拟输入事件、移除锁屏认证文件(需Root权限)以及结合恢复模式抢救数据。文章提供了详细的操作步骤与风险提示,强调提前开启USB调试的重要性,是Android用户应对紧急锁屏情况的有效技术指南。

weixin_29229055的博客 923

POJ 3294 不小于k个字符串中的最长子串

将n个字符串连接起来,中间用没有出现过的字符隔开,然后求后缀数组,二分答案,进行分组,判断每组的后缀是否出现在不小于k的原串中。 #include&lt;cstdio&gt; #include&lt;algorithm&gt; #include&lt;cstring&gt; const int MAXN = 1e5+1e3; int r[MAXN]; // r 数组保存了字符串中的每个元素...

兜率工的博客 484

K8s-K8s部署Zookeeper+Kafka+ELFK+持久化数据

K8s环境下容器化部署`Zookeeper+Kafka+ELFK`日志收集系统

✅ 专注企业级 Linux/DevOps 运维的实战派 ✅ 已输出上百篇可落地方案 ✅ Shell 脚本开箱即用 ✅ K8s/YAML 环境验证 ✅ 故障排查链路完整复现 1916

后缀数组(不小于k个字符串中的最长子串)

POJ 3294 Life Forms 题意:输入n个DNA序列,你的任务是求出一个长度最大的字符串,使得它在超过一般的DNA序列中出现。如果有多解,按照字典序从小到大输入所有解,无解输出?。 思路:把所有的都连接起来,用不同的字符隔开,求其后缀数组和height数组,然后二分长度,按照长度分组,判断是否有一组有超过一半的字符串,最后根据长度输出答案;/* * * 倍增算法(n*logn) *

ACMer_ZP的博客 744

Spring AI从入门到精通:构建智能Spring应用的全面指南

随着人工智能技术的快速发展,将大语言模型(LLM)与企业应用集成已成为趋势。Spring AI作为Spring官方推出的AI集成框架,为开发者提供了便捷、标准化的方式来构建智能应用。本文将从基础概念到高级应用,全面介绍Spring AI的核心功能与实践技巧。Spring AI 是 VMware 于 2023 年推出的开源框架,旨在简化大语言模型(LLM)与 Spring 应用的集成。它提供了统一的 API 抽象,支持多种 LLM 供应商,包括 OpenAI、Azure OpenAI、Hugging Face

qq_36929638的博客 1069

解析AI人工智能领域AI芯片的散热技术

当你用ChatGPT写代码、用AI生成高清图片时,背后的AI芯片可能正在“发高烧”——全球TOP500超算的平均功耗已突破10兆瓦,单颗GPU的峰值功耗超过700W(相当于3台家用空调同时运行)。本文将聚焦AI芯片的散热技术,覆盖从基础原理到前沿方案的全链条解析,帮助读者理解“散热为什么比算力更重要”。

AIGC应用创新大全的博客 936

POJ 3294 Life Forms(不小于k个字符串中的最长子串 后缀数组)

转载请注明出处,谢谢http://blog.youkuaiyun.com/acm_cxlove/article/details/7854526       by---cxlove 题目:输出所有的不小于k个字符串的最长子串 http://poj.org/problem?id=3294  将n个字符串连成来,中间用一个不同的字符隔开,倍增算法求出后缀数组。 然后二分答案,利用height值将后缀

窝不是爱酱,喵~~~~ 2340

【Simulink教程案例7】基于Simulink的滑模控制器设计与实现

欢迎订阅滑膜控制是一种变结构控制策略,其和常规控制方法的主要区别在于控制的不连续性,即一种使系统结构随时间变化的开关特性。所以,滑膜控制器也叫做变结构控制器,其本质是一类特殊的非线性控制器,并且这种非线性为不连续性。滑膜控制器和其他控制方式最大的区别在于其结构的不固定性,在其工作过程中,系统当前的状态会发生变化,使得系统按照预先设置的“滑动模态”的状态轨迹运动。正是由于这个特点,滑膜控制器具有快速响应的优点。滑模控制的基本定义如下所示:1).穿越切换面上的某个点;2).从切换面上的某个点离开;

FPGA/MATLAB学习教程/源码/项目合作开发 3242

POJ3294 出现在至少k个字符串中的最长子串

给定n个字符串,求出现在多于n/2个字符串中的最大长度的子串。 用朴素的搜索方法肯定不能满足时间要求。因此还是使用后缀数组。 首先把问题变成判定性问题,即长度为某个值的满足条件的子串是否存在。这样就可以使用二分来求解。 接着是把n个字符串用某个字符连接起来。计算出sa数组和height数组。对于每个需要判定的长度,对height数组进行分组,对每个分组分别进行统计,如果该分组中包含了多于n/

Shuyu Fang 3571

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

POJ-3294 后缀数组 求大于k/2个字符串中的最长子串(对height分组)

Life Forms Time Limit:5000MS Memory Limit:65536K Total Submissions:18828 Accepted:5546 Description You may have wondered why most extraterrestrial life forms resemble humans,...

an94460061的博客 391

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

poj 3294 后缀数组 多字符串中不小于 k 个字符串中的最长子串

Life Forms Time Limit:5000MS Memory Limit:65536K Total Submissions:16223 Accepted:4763 Description You may have wondered why most extraterrestrial life forms...

anuancong1219的博客 185

poj3294(不小于k个字符串中的最长子串---后缀数组)

#include #include #include #include #include #include #include                   //poj3294(不小于k个字符串中的最长子串---后缀数组) using namespace std; #define maxn 200010 using namespace std; int wa[

u012432475的专栏 457

POJ - 3294 - Life Forms(后缀数组,二分+分组技巧)

POJ - 3294 - Life Forms(后缀数组,二分+分组技巧) 题目链接:传送门 思路: part1 对于n个字符串,我们只需要找至少在n/2+1个字符串出现过的最长子串即可。 part2 如果k=1,我们只需输出最长的字符串即可(这里n肯定等于1,即本身) 否则我们首先将这n个字符串用不相同的特殊字符连接成一个字符串S,并记录每个下标位置属于哪个字符串。 二分...

Dch19990825的博客 325

POJ3294 Life Forms【后缀数组(不小于 k 个字符串中的最长子串)】

题目描述: 给出k个字符串,k<=100,每个字符串长度<=1000. 求最长的子串使得它出现在>k/2个字符串中,如果有多个最长,按字典序输出。 题目分析: 将 k 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组。然后二分答案,将后缀分成若干组,判断每组的后缀是否出现在大于 k/2 个的原串中。 因为答案子串长度都是一样的所以可以用后缀数组确定字典序,...

Master.Yi的博客 249

poj3294 后缀数组+二分

(http://www.elijahqi.win/2017/07/19/poj3294-%E5%90%8E%E7%BC%80%E6%95%B0%E7%BB%84%E4%BA%8C%E5%88%86/) Life Forms Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 15713 Accepted: 4615 De...

Elijahqi 368

POJ 3294不小于k个字符串中的最长子串

不小于k个字符串中的最长子串 Description You may have wondered why most extraterrestrial life forms resemble humans, differing by superficial traits such as height, colour, wrinkles, ears, eyebrows and the like. ...

liankewei的博客 63

poj3294 Life Forms - 后缀数组

题目链接:http://poj.org/problem?id=3294 题目大意:求出现在超过一半字符串中的最长子串 解题思路:后缀数组+二分 二分枚举最长子串的长度,根据height[]分组,验证是否存在 在一组中出现了超过一半次数的字符串。 (这是height[]的应用之一,罗穗骞大大的论文里就有讲~) #include<cstdio> #i...

155

poj 3294 Life Forms(不小于k 个字符串中的最长子串)

 Life Forms Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 9941   Accepted: 2740 Description You may have wondered why most extraterrestrial life forms r

WEYuLi的专栏 1140

POJ 3294 Life Forms(后缀数组)

题目链接:http://poj.org/problem?id=3294 解题思路: 求出所有 最长的 出现在超过一半所给字符串的 子串。 这题是在错自闭了可以去POJ discuss里面,有本题数据的。 反正我是疯狂OLE,RE了一晚上。 最后发现OLE是代码写错导致输出的串的数量不对(其实也就是WA),所以导致DEBUG的方向就出错了。 做法是二分答案,判断是否可行,可行就记录当前所...

shadiao.的博客 187

Life Forms POJ - 3294(不小于k个字符串中的最长子串)

题意:   求不小于字符串一半长度个字符串中的最长字串 解析:   论文题例11   将n个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开, 求后缀数组, 然后二分答案变为判定性问题, 然后判断每组的后缀是否出现在不小于 k 个的原串中, 这个做法的时间复杂度为O(nlogn) #include <iostream> #include <c...

babing2770的博客 146

poj3294

【题意】 n个字符串,求最长的出现在多于一半字符串中的子串 【输入】 多组数据 每组第一行一个n表示n个字符串 接下来n行是n个字符串 【输出】 对于每组答案,输出最长的出现在多于一半字符串中的子串,如有多个,按字典序输出 若不存在,则输出'?' 两组数据答案之间用空行分隔 后缀数组经典运用之一 二分答案,然后按height分组,看每组来自多少个不同的字符串

weixinding的专栏 1382

poj 3294 后缀数组

链接 http://poj.org/problem?id=3294 题意:给你n个字符串,n小于100,每个字符串的长度小于1000,让你找出至少在一半的字符串中出现过得最长的一个字串,如果有多个,那就按照字典序逐个输出 思路:我们先把所有的字符串连成一个大的字符串,每个字符串之间用一个没有出现过得字符xx隔开(注意这个字符也要两两不同),在把所有串连成一个大串的过程中,我们用一个set来把每

cstdio_hao的专栏 582
上一篇: poj 3415 :长度不小于 k 的公共子串的个数(后缀数组+单调栈)
下一篇: spoj 220 每个字符串至少出现两次且不重叠的最长子串 (后缀数组)
HARD_UNDERSTAND
博客等级 码龄11年 14粉丝 289原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值