传送门

我真是一个垃圾

模板题都不会做

模板题还要别人教

细节写法还要别人教

别人一分钟AC,教我算法还教我写法,最后写出来的别人算法还比我优秀一百倍

数据结构把脑子学傻了,看到题就想怎么用数据结构,半天做不来

别人1sAC,不是单调的么

纠结中间插啥子值,人家告诉我转为Int

最后还傻逼地写st表求lcp,人家直接单调队列

题读错了de半个晚上,还一直pe

mdzz,全世界都找不出第二个比我更蠢的人了

人家都线性代数学得风声水起了,我还在写傻逼题

全机房就我不会线性代数了

包括高一在内就我不知道FFT原理

啥子特征多项式,啥子特征值,

啥子啦普拉斯展开,啥子多项式求逆,啥子多项式取模,啥子多项式exp,啥子多点插值快速求值,别人信手拈来

就我一个傻逼连线性代数的门都没摸到

我tm连求导都求不陈展,微积分根本不知道是什么东西

数学烂得一塌糊涂

垃圾的一比

全机房最垃圾

心情不好,就想骂自己

我就tmd是一个世界无敌大傻逼

 //Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<queue>
#include<cmath>
#include<set>
#define For(i,a,b) for(int i=(a);i<=(b);i++)
#define Rep(i,a,b) for(int i=(a);i>=(b);i--)
const int N=;
typedef long long LL;
typedef double db;
using namespace std;
int n,s[N],bl[N],r[N],lcp[N],len;
char ss[N]; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} int sa[N],rak[N],h[N],st[N][];
void make_hight(int n) {
For(i,,n-) rak[sa[i]]=i;
for(int i=,k=;i<n;i++) {
if(!rak[i]) continue;
if(rak[i]==) {
int debug=;
}
if(k) k--;
int j=sa[rak[i]-];
while(s[i+k]==s[j+k]) k++;
h[rak[i]]=k;
st[rak[i]-][]=k;
}
For(j,,) For(i,,n-) if(i+(<<j)<n)
st[i][j]=min(st[i][j-],st[i+(<<j-)][j-]);
} int cmp(int a,int b,int y[],int k) {
int o1=a+k>=len?-:y[a+k];
int o2=b+k>=len?-:y[b+k];
return o1==o2&&y[a]==y[b];
} void make_sa(int n) {
static int c[N],t1[N],t2[N];
int m=,*x=t1,*y=t2,p;
For(i,,m-) c[i]=;
For(i,,n-) c[x[i]=s[i]]++;
For(i,,m-) c[i]+=c[i-];
Rep(i,n-,) sa[--c[x[i]]]=i;
for(int k=;k<=n;k<<=) {
p=;
For(i,n-k,n-) y[p++]=i;
For(i,,n-) if(sa[i]>=k) y[p++]=sa[i]-k;
For(i,,m-) c[i]=;
For(i,,n-) c[x[y[i]]]++;
For(i,,m-) c[i]+=c[i-];
Rep(i,n-,) sa[--c[x[y[i]]]]=y[i];
swap(x,y); x[sa[]]=; p=;
For(i,,n-)
x[sa[i]]=cmp(sa[i],sa[i-],y,k)?p-:p++;
m=p;
if(p>=n) break;
}
make_hight(n);
} int get_lcp(int i,int j) {
int k=;
for(k;i+(<<k)<=j;k++); if(k) k--;
return min(st[i][k],st[j-(<<k)][k]);
} int cnt[N],no[N],tot;
void solve() {
int ans=,pos=-; tot=;
while(pos+<len&&tot*<=n) {
pos++;
cnt[bl[sa[pos]]]++;
if(cnt[bl[sa[pos]]]==) tot++;
}
if(tot*<n) { puts("?"); return; }
lcp[]=get_lcp(,pos);
ans=lcp[];
For(i,,len-) {
no[i]=;
cnt[bl[sa[i-]]]--;
if(!cnt[bl[sa[i-]]]) tot--;
while(pos+<len&&tot*<=n) {
pos++;
cnt[bl[sa[pos]]]++;
if(cnt[bl[sa[pos]]]==) tot++;
}
if(tot*>=n) lcp[i]=get_lcp(i,pos);
else lcp[i]=;
ans=max(ans,lcp[i]);
if(lcp[i]==lcp[i-]&&h[i]>=lcp[i]) no[i]=;
}
if(!ans) { puts("?"); return; }
For(i,,len-) if(!no[i]&&lcp[i]==ans) {
For(j,sa[i],sa[i]+lcp[i]-)
printf("%c",'a'+s[j]);
puts("");
}
//puts("");
} //#define DEBUG
int main() {
#ifdef DEBUG
freopen("std.in","r",stdin);
//freopen(".out","w",stdout);
#endif
int id=,flag=;
for(;;) {
read(n);
if(!n) break;
len=; id=;
For(i,,n) {
scanf("%s",ss);
int tp=strlen(ss);
For(j,,tp-) { s[len++]=ss[j]-'a'; bl[len-]=i; }
s[len++]=++id;
}
For(i,,) cnt[i]=;
make_sa(len);
if(flag++) puts("");
solve();
}
return ;
}

poj3294Life Forms的更多相关文章

  1. POJ3294--Life Forms 后缀数组+二分答案 大于k个字符串的最长公共子串

                                                                              Life Forms Time Limit: 500 ...

  2. POJ3294Life Forms(广义后缀自动机)(后缀数组+二分+数状数组)

    You may have wondered why most extraterrestrial life forms resemble humans, differing by superficial ...

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

    题意: 给定 n 个字符串,求出现在不小于 k 个字符串中的最长子串. 分析: 将 n 个字符串连起来,中间用不相同的且没有出现在字符串中的字符隔开,求后缀数组. 然后二分答案,将后缀分成若干组,判断 ...

  4. Wizard Framework:一个自己开发的基于Windows Forms的向导开发框架

    最近因项目需要,我自己设计开发了一个基于Windows Forms的向导开发框架,目前我已经将其开源,并发布了一个NuGet安装包.比较囧的一件事是,当我发布了NuGet安装包以后,发现原来已经有一个 ...

  5. xamarin.forms新建项目android编译错误

    vs2015 update3 新建的xamarin.forms项目中的android项目编译错误.提示缺少android_m2repository_r22.zip,96659D653BDE0FAEDB ...

  6. ASP.NET Forms 身份验证

    ASP.NET Forms 身份验证 在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数.2. 创建登录页. 登录页中的操作包括: 1. 验证用 ...

  7. Xamarin.Forms 简介

    An Introduction to Xamarin.Forms 来源:http://developer.xamarin.com/guides/cross-platform/xamarin-forms ...

  8. C# 定时器 Timers.Timer Forms.Timer

    1.定义在System.Windows.Forms里 Windows.Forms里面的定时器比较简单,只要把工具箱中的Timer控件拖到窗体上,然后设置一下事件和间隔时间等属性就可以了 //启动定时器 ...

  9. Xamarin.Forms 免费电子书

    Xamarin Evolve 正在举行,现在已经放出2本免费的Xamarin.Forms 免费电子书,据现场的同学说这两天还有Xamarin.Forms 重磅消息发布: Creating Mobile ...

随机推荐

  1. CVE-2018-3246 weblogic xxe

    使用P牛2018-2894的容器 http://192.168.245.130:7001/ws_utc/begin.do 导入测试用例 上传时抓取数据包 POST /ws_utc/resources/ ...

  2. nodejs中命令行和node交互模式的区分

    来自:廖雪峰教程 么么哒~ 命令行模式和Node交互模式 请注意区分命令行模式和Node交互模式. 看到类似C:\>是在Windows提供的命令行模式: 在命令行模式下,可以执行node进入No ...

  3. 2.用Python套用Excel模板,一键完成原亮样式

    from xlutils.copy import copy import xlrd import xlwt tem_excel=xlrd.open_workbook('日统计.xls',formatt ...

  4. C++之数据类型--整形&sizeof关键字

    数据类型: C++规定在创建一个变量或者常量时,必须要指定出相应的数据类型,否则无法给变量分配内存 整型 **作用**:整型变量表示的是==整数类型==的数据 C++中能够表示整型的类型有以下几种方式 ...

  5. mysql分区partition详解

    分区管理  论坛 1. RANGE和LIST分区的管理 针对非整形字段进行RANG\LIST分区建议使用COLUMNS分区.  RANGE COLUMNS是RANGE分区的一种特殊类型,它与RANGE ...

  6. JS函数 有参数的函数 参数可以多个,根据需要增减参数个数。参数之间用(逗号,)隔开

    有参数的函数 上节中add2()函数不能实现任意指定两数相加.其实,定义函数还可以如下格式: function 函数名(参数1,参数2) { 函数代码 } 注意:参数可以多个,根据需要增减参数个数.参 ...

  7. leetcode-220-存在重复元素③*

    题目描述: 方法一:二叉搜索树+滑动窗口 方法二:桶排序 O(N) class Solution: def containsNearbyAlmostDuplicate(self, nums: List ...

  8. gevent实现并发

    #_author:来童星#date:2019/12/12import geventimport timedef func1(): print('\033[31;1mfun1 starting...\0 ...

  9. BZOJ 2957楼房重建

    传送门 线段树 //Twenty #include<cstdio> #include<cstdlib> #include<iostream> #include< ...

  10. linux下常见的包安装方式

    linux下常见的包安装方式 一.总结 一句话总结: rpm包安装 tar.gz源代码包安装 yum方式安装rpm包 bin文件安装 1.yum是什么? 安装所有依赖的软件包 Yum(全称为 Yell ...