题目来源:CF 427D Match & Catch

题意:给出2个字符串 求最短的连续的公共字符串 而且该字符串在原串中仅仅出现一次

思路:把2个字符串合并起来求height 后缀数组height的应用

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 100010;
char s[maxn];
int sa[maxn];
int t[maxn], t2[maxn], c[maxn];
int rank[maxn], height[maxn];
int l1, l2;
void build_sa(int m, int n)
{
int i, *x = t, *y = t2;
for(i = 0; i < m; i++)
c[i] = 0;
for(i = 0; i < n; i++)
c[x[i] = s[i]]++;
for(i = 1; i < m; i++)
c[i] += c[i-1];
for(i = n-1; i >= 0; i--)
sa[--c[x[i]]] = i;
for(int k = 1; k <= n; k <<= 1)
{
int p = 0;
for(i = n-k; i < n; i++)
y[p++] = i;
for(i = 0; i < n; i++)
if(sa[i] >= k)
y[p++] = sa[i] - k;
for(i = 0; i < m; i++)
c[i] = 0;
for(i = 0; i < n; i++)
c[x[y[i]]]++;
for(i = 0; i < m; i++)
c[i]+= c[i-1];
for(i = n-1; i >= 0; i--)
sa[--c[x[y[i]]]] = y[i];
swap(x,y);
p = 1; x[sa[0]] = 0;
for(i = 1; i < n; i++)
x[sa[i]] = y[sa[i-1]] == y[sa[i]] && y[sa[i-1]+k] == y[sa[i]+k] ? p-1 : p++;
if(p >= n)
break;
m = p;
}
} void getHeight(int n)
{
int k = 0;
for(int i = 0; i <= n; i++)
rank[sa[i]] = i;
for(int i = 0; i < n; i++)
{
if(k)
k--;
int j = sa[rank[i]-1];
while(s[i+k] == s[j+k])
k++;
height[rank[i]] = k;
}
} bool ok(int m, int n)
{
int cnt1 = 0, cnt2 = 0;
for(int i = 1; i <= n; i++)
{
if(height[i] >= m)
{
if(sa[i-1] < l1)
cnt1++;
if(sa[i-1] > l1)
cnt2++;
}
else
{
if(sa[i-1] < l1)
cnt1++;
if(sa[i-1] > l1)
cnt2++;
if(cnt1 == 1 && cnt2 == 1)
return true;
cnt1 = cnt2 = 0;
}
}
return false;
}
int main()
{
char a[5555], b[5555];
while(scanf("%s %s", &a, &b) != EOF)
{
l1 = strlen(a);
l2 = strlen(b);
int n = 0;
for(int i = 0; i < l1; i++)
s[n++] = a[i];
s[n++] = 'z'+1;
for(int i = 0; i < l2; i++)
s[n++] = b[i];
s[n] = 0;
build_sa(128, n+1);
getHeight(n); int l = 1, r = 5000;
int ans = -1;
int len = min(l1, l2);
for(int i = 1; i <= len; i++)
if(ok(i, n))
{
ans = i;
break;
}
if(ans <= 0)
printf("-1\n");
else
printf("%d\n", ans);
}
return 0;
}

CF 427D Match &amp; Catch 求最短唯一连续LCS的更多相关文章

  1. poj 2001:Shortest Prefixes(字典树,经典题,求最短唯一前缀)

    Shortest Prefixes Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 12731   Accepted: 544 ...

  2. Codeforces 427D Match &amp; Catch(后缀自动机)

    [题目链接] http://codeforces.com/problemset/problem/427/D [题目大意] 给出一个两个字符串,求出最短且在两个字符串中唯一的公共子串. [题解] 以原字 ...

  3. 逆FizzBuzz问题求最短序列

    问题描述 FizzBuzz问题:一个大于0的自然数能整除3,将输出“Fizz”:能整除5,将输出“Buzz”:能整除3和5,将输出“FizzBuzz”:否则输出自己. 逆FizzBuzz问题最短序列: ...

  4. 状压dp,松鼠从起点出发,拿到所有坚果,然后返回起点,求最短时间。

    UVA10944 松鼠从起点出发,拿到所有坚果,然后返回起点,求最短时间. #include<iostream> #include<cstdio> #include<al ...

  5. codeforce D. Shortest Cycle(floyd求最短环)

    题目链接:http://codeforces.com/contest/1206/problem/D 给n个点,如果点a[ i ] &a[ j ] 不为0,则点a[ i ] 和 a[ j ] 直 ...

  6. [LeetCode] Shortest Unsorted Continuous Subarray 最短无序连续子数组

    Given an integer array, you need to find one continuous subarray that if you only sort this subarray ...

  7. 《github一天一道算法题》:分治法求数组最大连续子序列和

    看书.思考.写代码. /*************************************** * copyright@hustyangju * blog: http://blog.csdn. ...

  8. Task 4 求数组的连续子数组的最大和(团队合作)

    小组成员:李敏.刘子晗 1.设计思想:由于已经做过这个题目,只要对之前的程序加上相应的测试和约束即可.我们两个人一起商议后,决定了程序的主框架和并列出了最终可以实现的功能.先要定义数组长度和上下限的变 ...

  9. Leetcode 581.最短无序连续子数组

    最短无序连续子数组 给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序. 你找到的子数组应是最短的,请输出它的长度. 示例 1: 输入: [2, ...

随机推荐

  1. A - Jugs ZOJ - 1005 (模拟)

    题目链接:https://cn.vjudge.net/contest/281037#problem/A 题目大意:给你a,b,n.a代表第一个杯子的容量,b代表第二个杯子的容量,然后一共有6种操作.让 ...

  2. 【SVN】命令行忽略不必要的文件和文件夹

    SVN命令参考:   https://www.cnblogs.com/wlsxmhz/p/5775393.html 我们需要明白命令行设置忽略文件和文件夹是通过设置svn:ignore属性设置的,pr ...

  3. elasticsearch安装ik分词器(非极速版)

    1.下载下载地址为: https://github.com/medcl/elasticsearch-analysis-ik 2.解压把下载的 elasticsearch-analysis-ik.zip ...

  4. css-通过hover实现鼠标进过背景色变化

     通过hover实现鼠标进过背景色变化 <!DOCTYPE html> <html lang="en"> <head> <meta cha ...

  5. java 代理 agency

    java并没有对其提供直接的支持,这是继承和组合的中庸之道,因为我们将一个成员对象置于所要构造的类中(组合),但与此同时我们在新类中暴露了该成员的所有方法(就像继承),使用代理时可以拥有更多的控制力, ...

  6. K8S Dashborad登陆认证文档

    K8S Dashboard是官方的一个基于WEB的用户界面,专门用来管理K8S集群,并可展示集群的状态.因为我们使用kubeadm搭建的集群会默认开启RABC(角色访问控制机制),所以我们必须要进行额 ...

  7. CSS------Filter属性的使用方法

    转载: http://www.w3cplus.com/css3/ten-effects-with-css3-filter

  8. 谈 JavaScript 中的强制类型转换 (2. 应用篇)

    这一部分内容是承接上一篇的, 建议先阅读谈 JavaScript 中的强制类型转换 (1. 基础篇) 前两章讨论了基本数据类型和基本包装类型的关系, 以及两个在类型转换中十分重要的方法: valueO ...

  9. 好用的在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具-ApiPost

    现在的模拟发送请求插件很多比如老外的postman等,但亲测咱们国内的 ApiPost 更好用一些,因为它不仅可以模拟发送get.post.delete.put请求,还可以导出文档,支持团队协作也是它 ...

  10. Oracle中append与Nologging

    快速向表中插入大量数据Oracle中append与Nologging 2017-05-05 / VIEWS: 304 来源于:http://blog.sina.com.cn/s/blog_61cd89 ...