题目来源: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. find中的-print0和xargs中-0的奥妙【转】

    find cygnus/firmware_cygnus/target/linux/brcm5830/files/arch/arm/mach-iproc/pm_iproc/ -name "*. ...

  2. C# XML 文档注释

    原文链接:http://www.shinater.com/DocsBuilder/help.html <summary>description</summary> 描述类型或类 ...

  3. Python_oldboy_常用模块(九)

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & pickle shelve xml处理 yaml处理 configpar ...

  4. ajax发送多个跨域请求回调不混乱

    var count = 0; var codes = ""; function refreshCache(urls){ try { var url = urls.split(&qu ...

  5. C语言:逻辑推理

    1A.B.C.D.E五名学生有可能参加计算机竞赛,根据下列条件判断哪些(10分) 题目内容:   A.B.C.D.E五名学生有可能参加计算机竞赛,根据下列条件判断哪些 人参加了竞赛: (1)A参加时, ...

  6. linux网络管理基本命令

    1.last 显示所有用户的登录情况 2.lastlog 显示那些用户有登录过,那些用户从来没登录过 3.traceroute 探测我指定网站的路径,来跟踪路由 .如:traceroute   www ...

  7. 【AtCoder】Tenka1 Programmer Contest(C - F)

    C - Align 考的时候,我大胆猜了结论,就是一小一大一小一大这么排 证明的话,由于我们总是要加上相邻的最大值而减去最小值,我们就让最大值都保持在前面 如果长度为奇数,要么就是大小大小大,要么是小 ...

  8. spark web ui中的skipped的含义

    顾名思义,跳出的意思啦. 例如如图: skipped的stages代表是已经执行过了.所以不需要再执行了. 如何,你有一个 testRdd.然后先做 testRdd.Filter("xxx& ...

  9. 024.Zabbix告警等级机制

    一 等级告警 告警升级可以对告警结果按自定义的时间段进行进行消息发送,并执行命令,形成一个梯度的告警处理. 二 按时间自定义告警梯度 2.1 添加时间发生的时间戳和发送时间 2.2 设置三个等级梯度 ...

  10. python 函数式编程学习笔记

    函数基础 一个函数就是将一些语句集合在一起的部件,它们能够不止一次地在程序中运行.函数的主要作用: 最大化的代码重用和最小化代码冗余 流程的分解 一般地,函数讲的流程是:告诉你怎样去做某事,而不是让你 ...