UVA - 11107:Life Forms
后缀数组height+二分
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<iostream>
#define MAXN 100*10000+10
#define pii pair<int,int>
using namespace std;
struct Node{
pii v;
int p;
friend bool operator < (const Node &p1,const Node &p2){
return (p1.v<p2.v);
}
}tsa[MAXN]; char s[MAXN];
int T,n;
int b[],p[MAXN],ans[MAXN];
int rk[MAXN],sa[MAXN];
void build_sa(){
for(int i=;i<=n;i++){
rk[i]=s[i]-;
}
for(int k=;k<=n;k<<=){
for(int i=;i<=n-k;i++){
tsa[i].v=make_pair(rk[i],rk[i+k]);
tsa[i].p=i;
}
for(int i=n-k+;i<=n;i++){
tsa[i].v=make_pair(rk[i],);
tsa[i].p=i;
}
sort(tsa+,tsa+n+);
int cnt=;
for(int i=;i<=n;i++){
if(!cnt||tsa[i].v!=tsa[i-].v){
cnt++;
}
rk[tsa[i].p]=cnt;
}
if(cnt>=n)break;
}
for(int i=;i<=n;i++){
sa[rk[i]]=i;
}
}
int height[MAXN];
void build_height(){
int k=;
for(int i=;i<=n;i++){
if(k)k--;
int j=sa[rk[i]-];
while(s[i+k]==s[j+k]){
k++;
}
height[rk[i]]=k;
}
}
void init(){
n=;
char tmp='z'+;
for(int i=;i<=T;i++){
scanf("%s",s+n+);
int t=n;
n=strlen(s+);
s[++n]=(tmp++);
for(int j=t+;j<=n;j++){
p[j]=i;
}
}
build_sa();
build_height();
}
int check(int x){
memset(b,,sizeof(b));
int cnt=;
int ret=;
for(int i=;i<=n;i++){
if(height[i]>=x){
if(!cnt){
if(p[sa[i]]==p[sa[i-]]){
cnt=;
}
else{
cnt=;
}
b[p[sa[i]]]=b[p[sa[i-]]]=;
}
else if(!b[p[sa[i]]]){
b[p[sa[i]]]=;
cnt++;
}
if(cnt>T/){
ans[sa[i]]=;
ret=;
}
}
else{
memset(b,,sizeof(b));
cnt=;
}
}
return ret;
}
vector<string> vs;
string ept;
void print(int x){
vs.clear();
string ts(s,n+);
for(int i=;i<=n;i++){
if(ans[i]){
string t;
t=ept;
for(int j=i;j<=i+x-;j++){
t+=s[j];
}
vs.push_back(t);
}
}
sort(vs.begin(),vs.end());
vs.erase(unique(vs.begin(),vs.end()),vs.end());
for(int i=;i<vs.size();i++){
cout<<vs[i]<<endl;
}
}
void solve(){
// for(int i=1;i<=n;i++){
// for(int j=sa[i];j<=n;j++){
// printf("%c",s[j]);
// }
// printf("\n");
// }
// for(int i=6;i<=n;i++){
// printf("%d\n",check(i));
// }
int L=,R=n;
while(R-L>){
int mid=(L+R)/;
if(check(mid)){
L=mid;
}
else{
R=mid;
}
}
memset(ans,,sizeof(ans));
if(R&&check(R)){
print(R);
}
else{
if(L&&check(L)){
print(L);
}
else{
printf("?\n");
}
}
}
int main()
{
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
int flag=;
while(){
scanf("%d",&T);
if(!T)break;
if(flag){
printf("\n");
}
else{
flag=;
}
if(T==){
scanf("%s",s+);
printf("%s\n",s+);
continue;
}
init();
solve();
}
return ;
}
UVA - 11107:Life Forms的更多相关文章
- 后缀数组练习4:Life Forms
有一个细节不是特别懂,然后的话细节有点多,就是挺难发现的那一种,感谢大佬的博客 1470: 后缀数组4:Life Forms poj3294 时间限制: 1 Sec 内存限制: 128 MB提交: ...
- 后缀数组 UVA 11107 Life Forms
题目链接 题意:训练指南P223 分析:二分长度,把所有字符串连成一个字符串,中间用不同的字符分隔(这是为了保证匹配长度始终在一个字符串内).height数组分段,vis数组标记哪些字符串被访问了,如 ...
- UVa 11107 (后缀数组 二分) Life Forms
利用height值对后缀进行分组的方法很常用,好吧,那就先记下了. 题意: 给出n个字符串,求一个长度最大的字符串使得它在超过一半的字符串中出现. 多解的话,按字典序输出全部解. 分析: 在所有输入的 ...
- uva 11107 Life Forms
题意:给你N个串,求一个串在大于等于N/2的模板串中连续出现.如果有多解按字典序最小输出. 白书模板题.二分答案+合并模板串成一个新串,扫秒新串的height数组. 考查后缀数组+LCP #inclu ...
- 后缀数组LCP + 二分 - UVa 11107 Life Forms
Life Forms Problem's Link Mean: 给你n个串,让你找出出现次数大于n/2的最长公共子串.如果有多个,按字典序排列输出. analyse: 经典题. 直接二分判断答案. 判 ...
- UVA - 11107 Life Forms (广义后缀自动机)
题意:给你n个字符串,求出在超过一半的字符串中出现的所有子串中最长的子串,按字典序输出. 对这n个字符串建广义后缀自动机,建完后每个字符串在自动机上跑一遍,沿fail树向上更新所有子串结点的出现次数( ...
- UVA - 11107 Life Forms (广义后缀自动机+后缀树/后缀数组+尺取)
题意:给你n个字符串,求出在超过一半的字符串中出现的所有子串中最长的子串,按字典序输出. 这道题算是我的一个黑历史了吧,以前我的做法是对这n个字符串建广义后缀自动机,然后在自动机上dfs,交上去AC了 ...
- UVA 11107 Life Forms——(多字符串的最长公共子序列,后缀数组+LCP)
题意: 输入n个序列,求出一个最大长度的字符串,使得它在超过一半的DNA序列中连续出现.如果有多解,按照字典序从小到大输出所有解. 分析:这道题的关键是将多个字符串连接成一个串,方法是用不同的分隔符把 ...
- POJ 3294 UVA 11107 Life Forms 后缀数组
相同的题目,输出格式有区别. 给定n个字符串,求最长的子串,使得它同时出现在一半以上的串中. 不熟悉后缀数组的童鞋建议先去看一看如何用后缀数组计算两个字符串的最长公共子串 Ural1517 这道题的思 ...
随机推荐
- 20155215 第二周测试1 与 myod
课堂测试 第一题 每个.c一个文件,每个 .h一个文件,文件名中最好有自己的学号 用Vi输入图中代码,并用gcc编译通过 在Vi中使用K查找printf的帮助文档 提交vi编辑过程截图,要全屏,包含自 ...
- 敏捷冲刺每日报告三(Java-Team)
第三天报告(10.27 周五) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://gi ...
- 20145237 实验一 逆向与Bof基础
20145237 实验一 逆向与Bof基础 1.直接修改程序机器指令,改变程序执行流程 此次实验是下载老师传给我们的一个名为pwn1的文件. 首先,用 objdump -d pwn1 对pwn1进行反 ...
- XML使用练习
#!/usr/bin/env python # -*- coding:utf-8 -*- import requests from xml.etree import ElementTree as ET ...
- Django 测试驱动开发
第一章 1.编写functional_tests.py from selenium import webdriver browser = webdriver.Firefox() browser.get ...
- 最短路算法模板SPFA、disjkstra、Floyd
朴素SPFA(链表建边) #include <iostream> #include <cstdio> #include <cstring> #include < ...
- SpaceVim - 让你的vim变得更加高效和强大
SpaceVim 中文手册 项 目 主 页: https://spacevim.org Github 地址 : https://github.com/SpaceVim/SpaceVim SpaceVi ...
- js进度条小事例
<style> #div1{width: 500px;height: 20px;border: 1px solid gray;} #div2{height: 20px;width: 0px ...
- Python之格式化输出,初始编码以及运算符
一.题型 1.使用while循环输入 1 2 3 4 5 6 8 9 10 count = 0 while count < 10: count += 1 #count = count + ...
- MYSQL之视图、触发器、存储过程、函数、事物、数据库锁和数据库备份
一.视图 -- view 视图:是一个虚报表,其内容由查询定义.同真实的表一样,视图包含一系列带有名称的列和行数据. 视图有如下特点: 1.视图的列可以来自不同的表,是表的抽象和逻辑意义上建立的新关系 ...