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 这道题的思 ...
随机推荐
- scrapy 数据存储mysql
#spider.pyfrom scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Ru ...
- 利用python 创建XML文件
#coding=utf-8 from xml.etree import ElementTree import pdb def printNodeInfo(node): #node.tag 标签名称 # ...
- nyoj 孪生素数
孪生素数问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 写一个程序,找出给出素数范围内的所有孪生素数的组数.一般来说,孪生素数就是指两个素数距离为2,近的不能再 ...
- 关于 Bootstrap的知识
Bootstrap是简单.灵活的用于搭建WEB页面的HTML.CSS.Javascript的工具集.Bootstrap基于HTML5和CSS3,具有漂亮的设计.友好的学习曲线.卓越的兼容性,还有12列 ...
- unity A*寻路 (三)A*算法
这里我就不解释A*算法 如果你还不知道A*算法 网上有很多简单易懂的例子 我发几个我看过的链接 http://www.cnblogs.com/lipan/archive/2010/07/01/1769 ...
- Spring知识点回顾(06)Profile 和 条件注解 @Conditional
1.设定环境中的active profiles 如:DispatcherServerlet的init-param spring.profiles.active=production spring.pr ...
- spring-oauth-server实践:OAuth2.0 通过header 传递 access_token 验证
一.解析查找 access_token 1.OAuth2AuthenticationProcessingFilter.tokenExtractor 2.发现来源可以有两处:请求的头或者请求的参数 二. ...
- Angular UI框架 Ng-alain @delon的脚手架的生成开发模板
前言 首先感谢下 cipchk基于 Ng-Zorror 框架上制作的ng-alain . 之前很早就关注了 ng-alain,今天得空折腾了下. 折腾的时候发现官方文档有些坑,没有写清楚,所以我作为一 ...
- 前端之BOM和DOM
BOM和DOM简介 BOM(Browser Object Model)是指浏览器对象模型,它使JavaScript有能力与浏览器进行“对话”. DOM(Document Object Model)是指 ...
- API之实用工具Postman 使用方法
测试接口与文档信息文件 Postman 安装与入门教程 下载与安装 官方网站:www.getpostman.com 下载完成后,直接安装 输入2次邮箱,密码,即可注册并登陆! 开发者使用: 创建文件夹 ...