题目大意:
  求多个字符串的LCS。

思路:
  同SPOJ-LCS2,不过因为SPOJ上数据比较水,当时用错误的写法过掉了,这次用正确的写法重新过了一遍。
  拓扑排序按照每个状态的len值,用计数排序实现。
  每个状态往上更新时,应该对std::min(s[p].maxlen,s[q].len)取max(每个状态能匹配的最长子串长度不超过len)。

 #include<cstdio>
#include<cstring>
#include<algorithm>
const int inf=0x7fffffff;
const int LEN=;
int n;
char s[LEN];
class SuffixAutomaton {
private:
static const int SIGMA_SIZE=;
struct State {
int len,link,go[SIGMA_SIZE],maxlen,min;
};
int sz,root,last,len;
int cnt[LEN],top[LEN<<];
State s[LEN<<];
int newState(const int l) {
sz++;
s[sz].len=l;
s[sz].min=inf;
return sz;
}
int idx(const char ch) {
return ch-'a';
}
void extend(const char ch) {
int w=idx(ch);
int p=last;
int new_p=newState(s[p].len+);
while(p&&!s[p].go[w]) {
s[p].go[w]=new_p;
p=s[p].link;
}
if(!p) {
s[new_p].link=root;
s[root].go[w]=new_p;
} else {
int q=s[p].go[w];
if(s[q].len==s[p].len+) {
s[new_p].link=q;
} else {
int new_q=newState(s[p].len+);
memcpy(s[new_q].go,s[q].go,sizeof s[q].go);
s[new_q].link=s[q].link;
s[q].link=s[new_p].link=new_q;
while(p&&s[p].go[w]==q) {
s[p].go[w]=new_q;
p=s[p].link;
}
}
}
last=new_p;
}
public:
void build(char str[]) {
root=last=newState();
len=strlen(str);
for(int i=;str[i];i++) extend(str[i]);
}
void top_sort() {
for(int i=;i<=sz;i++) cnt[s[i].len]++;
for(int i=len;i;i--) cnt[i-]+=cnt[i];
for(int i=;i<=sz;i++) top[cnt[s[i].len]--]=i;
}
void match(char str[]) {
int p=root,tmp=;
for(int i=;str[i];i++) {
int w=idx(str[i]);
if(s[p].go[w]) {
tmp++;
p=s[p].go[w];
} else {
while(p&&!s[p].go[w]) {
p=s[p].link;
}
if(!p) {
tmp=;
p=root;
} else {
tmp=s[p].len+;
p=s[p].go[w];
}
}
s[p].maxlen=std::max(s[p].maxlen,tmp);
}
for(int i=;i<=sz;i++) {
int p=top[i],q=s[p].link;
s[q].maxlen=std::max(s[q].maxlen,std::min(s[p].maxlen,s[q].len));
s[p].min=std::min(s[p].min,s[p].maxlen);
s[p].maxlen=;
}
}
int lcs() {
int ret=;
for(int i=;i<=sz;i++) ret=std::max(ret,s[i].min);
return ret;
}
};
SuffixAutomaton sam;
int main() {
scanf("%d",&n);
scanf("%s",s);
sam.build(s);
sam.top_sort();
for(int i=;i<=n;i++) {
scanf("%s",s);
sam.match(s);
}
printf("%d\n",sam.lcs());
return ;
}

[POI2000]Repetitions的更多相关文章

  1. BZOJ 2946: [Poi2000]公共串

    2946: [Poi2000]公共串 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 342[Submit][Status][D ...

  2. 【BZOJ】【2938】【POI2000】病毒

    AC自动机 好题>_<(其实是一次AC有些感动) 嗯要找到无限长的一个字符串不包含任何一个模板串,就意味着在AC自动机(Trie图)上找到一个不经过任何一个危险结点的环,深搜一下就好了…… ...

  3. bzoj2940: [Poi2000]条纹

    2940: [Poi2000]条纹 条纹游戏是一个双人的游戏.所需要的物品有一个棋盘以及三种颜色的长方形条纹,这三种颜色分别是红色.绿色和蓝色.所有的红色条纹的尺寸是c*1,所有的绿色条纹的尺寸是z* ...

  4. BZOJ 2946: [Poi2000]公共串( 后缀自动机 )

    一个串建后缀自动机, 其他串在上面跑, 然后用当前串跑的去更新全部 ------------------------------------------------------------------ ...

  5. HUST 1352 Repetitions of Substrings(字符串)

    Repetitions of Substrings Description The “repetitions” of a string S(whose length is n) is a maximu ...

  6. CJOJ 2482 【POI2000】促销活动

    CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...

  7. BZOJ 2938: [Poi2000]病毒 [AC自动机 拓扑排序]

    2938: [Poi2000]病毒 题意:判断是否存在无限长的不含模式串的字符串.只有01. 建出套路DP的转移图,判断有环就行了 练习一下拓扑排序 #include <iostream> ...

  8. BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案

    BZOJ_2946_[Poi2000]公共串_后缀数组+二分答案 Description          给出几个由小写字母构成的单词,求它们最长的公共子串的长度. 任务: l        读入单 ...

  9. BZOJ_2938_[Poi2000]病毒_AC自动机

    BZOJ_2938_[Poi2000]病毒_AC自动机 Description 二进制病毒审查委员会最近发现了如下的规律:某些确定的二进制串是病毒的代码.如果某段代码中不存在任何一段病毒代码,那么我们 ...

随机推荐

  1. 【HASPDOG】hasp_update参数f和i区别

    [root@BICServer-TX shared]# ./hasp_update This is a simple demo program for the Sentinel Update and ...

  2. Python Challenge 第 5 关攻略:peak

    # -*- coding: utf-8 -*- # @Time : 2018/9/26 14:03 # @Author : cxa # @File : pickledemo.py # @Softwar ...

  3. 【bzoj3065】: 带插入区间K小值 详解——替罪羊套函数式线段树

    不得不说,做过最爽的树套树———— 由于有了区间操作,我们很容易把区间看成一棵平衡树,对他进行插入,那么外面一层就是平衡树了,这就与我们之前所见到的不同了.我们之前所见到的大多数是线段树套平衡树而此题 ...

  4. 七、springcloud之配置中心Config(二)之高可用集群

    方案一:传统作法(不推荐) 服务端负载均衡 将所有的Config Server都指向同一个Git仓库,这样所有的配置内容就通过统一的共享文件系统来维护,而客户端在指定Config Server位置时, ...

  5. 二、springcloud之熔断器hystrix

    一.背景 雪崩效应 在微服务架构中通常会有多个服务层调用,基础服务的故障可能会导致级联故障,进而造成整个系统不可用的情况,这种现象被称为服务雪崩效应.服务雪崩效应是一种因“服务提供者”的不可用导致“服 ...

  6. vue2.0组件之间的传值

    1.父子组件--props props:需要注意的是,虽然的是单向的数据流,但是如果传递的是数组或是对象这样的引用类型,子组件数据变化,父组件的数据通也会变化 子组件代码 <template&g ...

  7. python基础--面向对象

    什么是面向对象编程 OOP编程是利用“类”和对象来创建各种模型来实现对真实世界的描述. OOP具有可维护性和可扩展性 二:面向对象有那些特性 1)CLASS类:一个类是对拥有相同属性的对象的抽象.类拥 ...

  8. java基础49 IO流技术(对象输入流/对象输出流)

    1.对象输入输出流 对象注意作用是用于写对象信息与读取对象信息 1.对象输出流:ObjectOutputStream    2.对象输入流:ObjectInputStream 2.对象输入输出流的步骤 ...

  9. 洛谷P1411 砝码称重

    传送门啦 这个题总体思路就是先搜索在 $ dp $ void dfs(int keep,int now){ //使用 放弃 if(now > m) return; //已经放弃超过m个了,就退出 ...

  10. thinkphp模型创建