CODE【VS】3160 最长公共子串 (后缀自动机)
3160 最长公共子串
题目描述 Description
给出两个由小写字母组成的字符串,求它们的最长公共子串的长度。
输入描述 Input Description
读入两个字符串
输出描述 Output Description
输出最长公共子串的长度
样例输入(Sample Input)
yeshowmuchiloveyoumydearmotherreallyicannotbelieveit
yeaphowmuchiloveyoumydearmother
样例输出(Sample Output)
27
数据范围及提示
单个字符串的长度不超过100000
后缀自动机模版题,先以第一个串建立一个后缀自动机,第二个串直接匹配
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define ll long long
#define inf 300
#define mod 1000000007
using namespace std;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+ch-'0';
        ch=getchar();
    }
    return x*f;
}
const int N=100005;
const int sigma=27;
int n;
char ch[N<<1];
struct sam{
	int cnt,last;
	int fa[N<<1],a[N<<1][sigma],mx[N<<1],len[N<<1];
	sam(){
		last=++cnt;
	}
	void extend(int c){
		int p=last,np=last=++cnt;mx[np]=mx[p]+1;
		while(!a[p][c]&&p)a[p][c]=np,p=fa[p];
		if(!p)fa[np]=1;
		else
		{
			int q=a[p][c];
			if(mx[p]+1==mx[q])fa[np]=q;
			else
			{
				int nq=++cnt;mx[nq]=mx[p]+1;
				memcpy(a[nq],a[q],sizeof(a[q]));
				fa[nq]=fa[q];
				fa[np]=fa[q]=nq;
				while(a[p][c]==q)a[p][c]=nq,p=fa[p];
			}
		}
	}
	void solve(){
		scanf("%s",ch+1);
		memset(len,0,sizeof(len));
		int l=strlen(ch+1),p=1,tmp=0,ans=0;
		for(int i=1;i<=l;i++)
		{
			int c=ch[i]-'a';
			while(!a[p][c]&&p)p=fa[p];
			if(p==0)p=1,tmp=0;
			else tmp=min(tmp,mx[p])+1,p=a[p][c];
			ans=max(ans,tmp);
		}
		printf("%d\n",ans);
	}
}sam;
int main()
{
    while(~scanf("%s",ch+1))
    {
	    int n=strlen(ch+1);
	    for(int i=1;i<=n;i++) sam.extend(ch[i]-'a');
	    sam.solve();
    }
    return 0;
}
CODE【VS】3160 最长公共子串 (后缀自动机)的更多相关文章
- codevs 3160 最长公共子串 后缀自动机
		http://codevs.cn/problem/3160/ 后缀自动机板子题,匹配的时候要注意如果到一个点失配向前匹配到一个点时,此时的tmp(当前匹配值)为t[j].len+1而不是t[t[j]. ... 
- CODE【VS】 3160 最长公共子串 (后缀数组)
		3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Outp ... 
- Codevs 3160 最长公共子串(后缀数组)
		3160 最长公共子串 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长 ... 
- SCOJ 4493: DNA 最长公共子串 后缀自动机
		4493: DNA 题目连接: http://acm.scu.edu.cn/soj/problem.action?id=4493 Description Deoxyribonucleic acid ( ... 
- codevs 3160 最长公共子串
		3160 最长公共子串 http://codevs.cn/problem/3160/ 时间限制: 2 s 空间限制: 128000 KB 题目描述 Description 给出两个由小写字母组 ... 
- codevs 3160 最长公共子串(SAM)
		3160 最长公共子串 题目描述 Description 给出两个由小写字母组成的字符串,求它们的最长公共子串的长度. 输入描述 Input Description 读入两个字符串 输出描述 Ou ... 
- poj 2774 最长公共子串 后缀数组
		Long Long Message Time Limit: 4000MS Memory Limit: 131072K Total Submissions: 25752 Accepted: 10 ... 
- bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)
		bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ... 
- 【wikioi】3160 最长公共子串(后缀自动机)
		http://codevs.cn/problem/3160/ sam的裸题...(之前写了spoj上另一题sam的题目,但是spoj被卡评测现在还没评测完QAQ打算写那题题解时再来详细介绍sam的.. ... 
随机推荐
- 安装 Spring 框架库
			下载地址:http://repo.spring.io/release/org/springframework/spring 
- 洛谷 P2062 分队问题
			这题太毒了....一开始就是死活想不到,结果看了很多遍题解,重新做的时候还是做不出来.. 好像有一点被错误的题解误导了? #include<cstdio> #include<algo ... 
- 题解报告:hdu 2069 Coin Change(暴力orDP)
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2069 Problem Description Suppose there are 5 types of ... 
- win10系统下使用EDGE浏览器找不到Report Builder 启动图标
			Win10系统下如果要使用Report Builder,可能存在EDGE浏览器或者Chrome找不到ReportBuilder的启动图标的情况,此时,应以管理员权限运行IE浏览器,即可看到图标. 
- 459 Repeated Substring Pattern 重复的子字符串
			给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000.示例 1:输入: "abab"输出: True解释: 可由 ... 
- Kali linux 2016.2(Rolling)里的应用更新和配置额外安全工具
			写在前面的话 你去打人家 ,你不伪装一下,化化妆 ,穿上盔甲,难道你傻逼一样的 拿着棍子就去打人家,人家 一眼不认出你是谁了.做坏事要伪装好自己 ,要把自己藏起来 ,让别人找不到你,你以为网络公 ... 
- VS打包后生成快捷方式:目标指向错误、Icon图标分辨率有误问题解决方案
			1.目标指向错误: 在安装***.msi文件后,对快捷方式-->右键-->属性: 发现目标并非指exe文件. 于是我新建了一个快捷方式,将目标-->指向exe文件,位置Ctrl+v. ... 
- h5学习-canvas绘制矩形、圆形、文字、动画
			绘制矩形<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ... 
- JDK常用类解读--StringBuffer、StringBuilder
			上一篇博客讲到String对象一旦被创建该内容就不能被修改了如: String s = "hello world"; s.substring(6); s.replace(" ... 
- iOS - 事件处理全过程(补充)
			事件处理的完整过程 1> 先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件. 2> 调用最合适控件的touches….方法 3> 如果调用了[supe ... 
