题目大意:
  求多个字符串的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. weblogica domain目录 环境变量 如何启动weblogic server

    手工启动weblogic server

  2. 【bzoj题解】1012 最大数

    题目描述 现在请求你维护一个数列,要求提供以下两种操作:1.查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2.插入操作.语法:A ...

  3. Sort Colors I & II

    Given an array with n objects colored red, white or blue, sort them so that objects of the same colo ...

  4. 15 Defer, Panic, and Recover

    Defer, Panic, and Recover 4 August 2010 Go has the usual mechanisms for control flow: if, for, switc ...

  5. JQuery怎么实现页面左侧菜单刷新后保留鼠标点击addclass的样式?

    $('ul.main-menu li a').each(function(){ if($($(this))[0].href==String(window.location)) $(this).pare ...

  6. No.5 selenium学习之路之多窗口句柄

    多窗口相关操作 获取当前句柄 c_handle = driver.current_window_handle 获取所有句柄 all_handle = driver.window_handles 切换到 ...

  7. thinkphp模型创建

  8. 组件化表单解决方案AForm 1.3 发布

    v1.3 更新日志 输入控件的实现改为实例化模式,同类型多个输入控件在同一个表单不会冲突 输入控件实现了继承 可以使用AForm.create创建表单,和使用new AForm创建实例的参数和结果一样 ...

  9. Centos之文件搜索命令locate

    locate命令 locate 文件名 在后台数据库中按文件名搜索,搜索速度更快 /var/lib/mlocate #locate命令所搜索的后台数据库 updatedb 更新数据库 locate搜索 ...

  10. Tango ROS Streamer

    谁想要在Android平台上编写机器人应用,或者谁希望扩展其与室内定位和3D感知新的传感器的机器人开发,Intermodalics创建的ROS Streamer应用的Tango. 这个Android应 ...