题目大意:
就是对于两个字符串S1和S2, 求出他们最短的一个公共字串P, 满足P在S1中只出现1次, P在S2中也只出现一次, 输出P最小的长度, 如果这样的P不存在, 输出-1
大致思路:
很明显的一个做法是将S1和S2连接起来中间用未出现的字符隔开, 然后建立后缀自动机, 记录每一个状态中表示的字符串的来源(可以状压记录), 然后所有状态中, 满足Right集合为2, 且状压表示出现在了2个字符串中即可, 在这样一个状态中取最短可行长度, 遍历所有状态点即可, 复杂度O(|S1| + |S2|)
当然还可以用后缀数组来做, 考虑到P要满足的条件如果这样的P存在, 必定是sa数组中相邻的存在, 所以扫描一遍height数组, 当sa[i - 1]与sa[i]不属于同一字符串时, 考虑P不能再其他位置出现那么只能height[i - 1] < height[i], height[i + 1] < height[i]是存在这样的P, 最小长度为 max(height[i - 1], height[i + 1]) + 1, 扫描一遍height数组找出满足条件的最小的那一个P即可
后缀自动机代码如下:
Result : Accepted Memory : 2648 KB Time : 31 ms
/*
* Author: Gatevin
* Created Time: 2015/4/16 19:29:08
* File Name: Rin_Tohsaka.cpp
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
后缀数组做法如下:
Result : Accepted Memory : 400 KB Time : 31 ms
/*
* Author: Gatevin
* Created Time: 2015/4/16 20:11:25
* File Name: Rin_Tohsaka.cpp
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include