【链接】h在这里写链接


【题意】


给你n个字符串。

让你找最长的字符串s;

这个s在超过一半的子串里面都有出现过且长度大于n/2;

如果有多个,输出多行。

(按字典序输出)

也没说会不会出现大写。





【题解】


后缀数组+二分。



把每个字符串之间用一个没出现过的分隔符分开;

(从'z'+1开始)



100*1000 + 100

大概10万多的样子,设置成15万就好



长度越大,肯定是越不可能出现的。

有单调性的。

l = 2,r = 1000,temp = 0;

while (l <= r)...

连续的大于等于二分的长度的Height组

看看Sa值是不是把n/2 + 1个以上的覆盖到了。

(用set就好)



注意答案为1的时候的二分;





【错的次数】


0

【反思】


在这了写反思

【代码】

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std; const int N = 15e4;
const int MAX_CHAR = 1000;//每个数字的最大值。
int s[N + 10];//如果是数字,就写成int s[N+10]就好,从0开始存
int Sa[N + 10], T1[N + 10], T2[N + 10], C[N + 10];
int Height[N + 10], Rank[N + 10]; void build_Sa(int n, int m) {
int i, *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 (int k = 1; k <= n; k <<= 1)
{
int 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 n)
{
int i, j, k = 0;
for (i = 1; i <= n; i++) Rank[Sa[i]] = i;
for (i = 0; i<n; i++) {
if (k) k--;
j = Sa[Rank[i] - 1];
while (s[i + k] == s[j + k]) k++;
Height[Rank[i]] = k;
}
} const int MAXL = 1000;
int n,len,idx[N+10];
char S[MAXL + 10]; bool ok(int l)
{
//找同一组大于等于l的
set <int> mset;
mset.clear();
for (int i = 2; i <= len; i++)//枚举排名第i的后缀
if (Height[i]>=l)
{
mset.insert(idx[Sa[i - 1]]), mset.insert(idx[Sa[i]]);//
}
else
{
if ((int)mset.size() >= n / 2 + 1) return true;
mset.clear();
}
if ((int)mset.size() >= n / 2 + 1) return true;
return false;
} void out(int l)
{
set <int> mset;//模拟之前的过程再做一遍就好
mset.clear();
for (int i = 2; i <= len; i++)//枚举排名第i的后缀
if (Height[i] >= l)
{
mset.insert(idx[Sa[i - 1]]), mset.insert(idx[Sa[i]]);//
}
else
{
if ((int)mset.size() >= n / 2 + 1)
{
for (int j = Sa[i - 1]; j <= Sa[i - 1] + l - 1; j++)
putchar((char)s[j]);
puts("");
}
mset.clear();
}
//不可能为0
} int main() {
//freopen("F:\\rush.txt", "r", stdin);
while (~scanf("%d", &n) && n>0)
{
len = 0;int ls;
for (int i = 1; i <= n; i++)
{
scanf("%s", S);
ls = strlen(S);
for (int j = 0; j < ls; j++) {
idx[len] = i;
s[len++] = S[j];
}
idx[len] = i;
s[len++] = i + 'z';
}
s[len] = 0;
build_Sa(len + 1, MAX_CHAR);
getHeight(len);
//开始二分最后的答案的长度
int l = 1, r = MAXL, temp = 0;
while (l <= r)
{
int mid = (l + r) >> 1;
if (ok(mid))
{
temp = mid;
l = mid + 1;
}
else
{
r = mid - 1;
}
}
if (temp == 0)
puts("?");
else
out(temp);
puts("");
}
return 0;
}

【POJ 3294】Life Forms的更多相关文章

  1. 【POJ 3294】Life Forms 不小于k个字符串中的最长子串

    一下午和一晚上都在刚这道题,各种错误都集齐了so sad 我的时间啊!!! 后缀数组就先做到这里吧,是在伤不起啊QAQ 出现了各种奇怪的错误,看了标算,然后乱改自己的代码,莫名其妙的改A了,后来发现用 ...

  2. bzoj 2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...

  3. 【链表】BZOJ 2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 382  Solved: 111[Submit][S ...

  4. BZOJ2288: 【POJ Challenge】生日礼物

    2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 284  Solved: 82[Submit][St ...

  5. BZOJ2293: 【POJ Challenge】吉他英雄

    2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 80  Solved: 59[Submit][Stat ...

  6. BZOJ2287: 【POJ Challenge】消失之物

    2287: [POJ Challenge]消失之物 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 254  Solved: 140[Submit][S ...

  7. BZOJ2295: 【POJ Challenge】我爱你啊

    2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 126  Solved: 90[Submit][Sta ...

  8. BZOJ2296: 【POJ Challenge】随机种子

    2296: [POJ Challenge]随机种子 Time Limit: 1 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 114  Solv ...

  9. BZOJ2292: 【POJ Challenge 】永远挑战

    2292: [POJ Challenge ]永远挑战 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 513  Solved: 201[Submit][ ...

随机推荐

  1. centos7.5安装公版mysql5.7.25

    ######### 卸载原来系统安装的包 # yum remove -y java cvs libselinux-devel postgresql mysql ecj jna sinjdoc 依赖包安 ...

  2. HZOI2019序列

    题目链接:https://www.cnblogs.com/Juve/articles/11186805.html(密码是我的一个oj用户名) 题解: 这题我考试打的暴力,只有5分. 一开始理解错题意了 ...

  3. vue中使用vue-echarts

    一.先说在原生里怎么使用echarts <!-- 1.引入echarts文件 --> <script src="echarts.min.js"></s ...

  4. php用正则表达式匹配URL的简单方法(亲测可行)

    https://www.jb51.net/article/43093.htm 在PHP的官网上看到的parse_url()函数的替代方案.结果和parse_url()函数差不多,是使用正则实现的.UR ...

  5. js笔试-接收get请求参数

    请编写一个JavaScript函数,它的用途是接收url中get请求的参数,并返回为对象, 如: var url = “https://i.cnblogs.com/EditPosts.aspx?opt ...

  6. pytest框架-介绍、Mark(打标签)、命令运行用例、用例执行顺序、

    1.pytest介绍:基于unittest 之上的单元测试框架 1.1.自动发现测试模块和测试用例: unitest 需要添加用例,(泰斯特楼贷)加载器加载测试用例 pytest 只需要一条代码就可以 ...

  7. Python玩转人工智能最火框架 TensorFlow应用实践

    Python玩转人工智能最火框架 TensorFlow应用实践 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...

  8. 二、Python安装和第一个程序

    <1.Python语言介绍1.官方介绍:Python 是一款易于学习且功能强大的编程语言. 它具有高效率的数据结构,能够简单又有效地实现面向对象编程.Python 简洁的语法与动态输入之特性,加 ...

  9. 一、WebService基础概念

    一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intrane ...

  10. phonegap geolocation android 问题

    很纠结的 phonegap 使用定位的时候 android 获取地址异常的慢,为什么呢? 经过分析 如果android 只开启gprs 上网功能 可以立即获取到经纬度 如果只开启wifi 根本就获取不 ...