在虐各种最长公共子串、子序列的题虐的不耐烦了之后,你决定反其道而行之。

一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是。 一个串的“子序列”指的是它的可以不连续的一段,例如bde是abcdef的子串,但bdd不是。 下面,给两个小写字母串A,B,请你计算: (1) A的一个最短的子串,它不是B的子串 (2) A的一个最短的子串,它不是B的子序列 (3) A的一个最短的子序列,它不是B的子串 (4) A的一个最短的子序列,它不是B的子序列

Input

有两行,每行一个小写字母组成的字符串,分别代表A和B。

Output

输出4行,每行一个整数,表示以上4个问题的答案的长度。如果没有符合要求的答案,输出-1.

Sample Input

aabbcc abcabc

Sample Output

2 4 2 4

HINT

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdio>
#include<map>
#define N 20013
#define p1 2000001001
#define ull unsigned long long
using namespace std;
int cnt,n,m,np,p,q,nq,l[N],r[N],pos[N],root;
int ch[N][],fa[N],len[N],last,ch1[N][],f[][];
ull mi[N];
char s[N],s1[N];
map<int,int> mp;
map<ull,int> mp1;
void extend(int i)
{
int c=s1[i]-'a'+;
p=last; np=last=++cnt; l[np]=l[p]+;
for (;!ch[p][c]&&p;p=fa[p]) ch[p][c]=np;
if (!p) fa[np]=root;
else {
q=ch[p][c];
if (l[q]==l[p]+) fa[np]=q;
else {
nq=++cnt; l[nq]=l[p]+;
memcpy(ch[nq],ch[q],sizeof(ch[q]));
fa[nq]=fa[q];
fa[q]=fa[np]=nq;
for (;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;
}
}
}
void solve1()
{
/*mi[0]=1;
for (int i=1;i<=max(n,m)+2;i++) mi[i]=mi[i-1]*p1;
for (int i=1;i<=m;i++){
ull x=(ull)s1[i]*mi[1]; mp1[x]=1;
//cout<<x<<endl;
for (int j=i+1;j<=m;j++) {
x=x*p1+s1[j]*mi[i];
mp1[x]=(j-i+1);
// cout<<x<<endl;
}
}
int mn=m+1;
for (int i=1;i<=n;i++) {
ull x=(ull)s[i]*mi[1];
if (!mp1[x]) mn=min(mn,1);
for (int j=i+1;j<=n;j++){
x=x*p1+s[j]*mi[1];
if (!mp1[x]&&j-i+1<=n) mn=min(mn,j-i+1);
}
}
if (mn>=m+1) PRintf("-1\n");
else printf("%d\n",mn);*/
memset(f,,sizeof(f));
int mn=m+;
for (int i=;i<=n;i++){
int a=,b=;
for (int j=;j<=n;j++) {
if (s[i]==s1[j]) f[i][j]=f[i-][j-]+;
a=max(f[i][j],a);
}
if (a!=i) mn=min(mn,a);
}
if (mn>=m+) printf("-1\n");
else printf("%d\n",mn+);
}
void solve2()//A的最短子串,不是B的子序列
{
memset(f,,sizeof(f));
int mn=m+;
for (int i=;i<=n;i++){
int a=,b=;
for (int j=;j<=m;j++) {
if (s[i]==s1[j]) f[i][j]=b+;
a=max(a,f[i][j]);
b=max(b,f[i-][j]); //f[i][j]表示A中的第i个字符匹配到B中第j个字符,A匹配时必须连续
}
if (a!=i) mn=min(mn,a);//匹配的长度不是i说明,在i+前一字符就是一个合法的子串
}
if (mn>=m+) printf("-1\n");
else printf("%d\n",mn+);
}
void solve3()//A的最短的子序列,不是b的子串。
{
memset(len,/,sizeof(len));
len[]=; int mn=m+; int t;
for (int i=;i<=n;i++)
for (int j=;j<=cnt;j++)
if (!(t=ch[j][s[i]-'a'+])) mn=min(mn,len[j]);//如果到该点匹配不上了,说明在当前基础上加入s[i]就能得到了一个合法的子序列
else len[t]=min(len[t],len[j]+);//len表示的是用a的子序列去匹配后缀自动机中的节点,到节点i能得到的最短长度
if (mn==m+) printf("-1\n");
else printf("%d\n",mn+);
}
void solve4()
{
for (int i=m;i>=;i--){//只要是在当前位置之后出现的字符都可以用来构造子序列,如果我们要选择字符x,那么必然优先选择最靠近当前位置的字符。
for (int j=;j<=;j++)
if (mp[j]) ch1[i][j]=mp[j];
mp[s1[i]-'a'+]=i;
}
memset(len,/,sizeof(len));
len[]=;
int mn=m+; int t;
for (int i=;i<=n;i++)
for (int j=m;j>=;j--)//这里与第三问不同,必须倒序枚举,因为这里相当于是个背包,那么对于一个字符来说,不能连续更新同一层中的位置,否则原串只有一个字符x,正序枚举会出现xx的情况。
if (!(t=ch1[j][s[i]-'a'+])) mn=min(mn,len[j]);
else len[t]=min(len[t],len[j]+);
if (mn==m+) printf("-1\n");
else printf("%d\n",mn+);
}
int main()
{
freopen("sus4.in","r",stdin);
//freopen("sus.out","w",stdout);
scanf("%s",s+);
scanf("%s",s1+);
n=strlen(s+); m=strlen(s1+);
root=last=++cnt;
for (int i=;i<=m;i++)
extend(i);
solve1();
solve2();
solve3();
solve4();
}

先留坑 ,待我变的更厉害好吧

bzoj 4032(A的一个最短的子串,它不是B的子串 || A的一个最短的子串,它不是B的子序列 || A的一个最短的子序列,它不是B的子串||A的一个最短的子序列,它不是B的子序列)的更多相关文章

  1. 编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数。定义 Gymnastics 类和 School 类,它们都是 ComputerAverage 的子类。Gymnastics 类中计算选手的平均成绩的方法是去掉一个最低分,去掉一个最高分,然后求平均分;School 中计算平均分的方法是所有科目的分数之和除以总科目数。 要求:定义ComputerAv

    题目: 编写一个ComputerAverage抽象类,类中有一个抽象方法求平均分average,可以有参数. 定义 Gymnastics 类和 School 类,它们都是 ComputerAverag ...

  2. BZOJ 4032: [HEOI2015]最短不公共子串

    4032: [HEOI2015]最短不公共子串 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 446  Solved: 224[Submit][Sta ...

  3. BZOJ 4032: [HEOI2015]最短不公共子串 后缀自动机 暴力

    4032: [HEOI2015]最短不公共子串 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=4032 Description 在虐各种最 ...

  4. bzoj 4032 [HEOI2015]最短不公共子串——后缀自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 不是 b 的子串的话就对 b 建后缀自动机,在 a 上枚举从每个位置开始的子串或者找子 ...

  5. bzoj 4032 [ HEOI 2015 ] 最短不公共子串 —— 后缀自动机+序列自动机

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4032 序列自动机其实就是每个位置记录一下某字母后面第一个出现位置,为了子序列能尽量长. 对字 ...

  6. BZOJ 4032 Luogu P4112 [HEOI2015]最短不公共子串 (DP、后缀自动机)

    这其实是道水题... 题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=4032 (luogu)https://www.luog ...

  7. BZOJ.4032.[HEOI2015]最短不公共子串(DP 后缀自动机)

    题目链接 1.求A的最短子串,它不是B的子串. 子串是连续的,对B建SAM,枚举起点,在SAM上找到第一个无法匹配点即可.O(n)用SAM能做吗..开始想错了. 2.求A的最短子串,它不是B的子序列. ...

  8. bzoj 4032: [HEOI2015]最短不公共子串【dp+SAM】

    第一.二问: 就是最小的最长公共长度+1,设f[i][j]为a匹配到i,b匹配到j,第一问的转移是f[i][j]=(a[i]==b[j]?f[i-1][j-1]+1:0),第二问的转移是f[i][j] ...

  9. BZOJ 4032: [HEOI2015]最短不公共子串 (dp*3 + SAM)

    转博客大法好 第4个子任务中,为什么只转移最近的一个位置,自己YY吧(多YY有益身体健康). #include <bits/stdc++.h> using namespace std; t ...

随机推荐

  1. LWIP带UCOS操作系统移植

    LWIP支持RAW.NETCONN.SOCKET这三种编程接口,后两者必须有操作系统来支持的:LWIP带操作系统的移植很重要!!

  2. Eclipse Failed to get the required ADT version number from SDK

    之前本人的AndroidStudio和Eclipse使用的是同一个SDK,然后使用AndroidStudio的 SDK Manager对SDK进行了update,再打开Eclipse就报了“Eclip ...

  3. SQL高性能分页

    分页的场景就不多说了,无处不在. 方法一:利用row_number() with C as ( select ROW_NUMBER() over(order by orderdate,orderid) ...

  4. (转)unordered_map与map的对比(C++11新特性)

    unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value.不同的是unordered_map不会根据key的大小进行排序, 存储时是根据key的ha ...

  5. HDU 2602 Bone Collector (01背包DP)

    题意:给定一个体积,和一些物品的价值和体积,问你最大的价值. 析:最基础的01背包,dp[i] 表示体积 i 时最大价值. 代码如下: #pragma comment(linker, "/S ...

  6. python中return的用法

    def testReturn(x): if x > 10000: return print "test return!!" #这句话永远不会得到执行 elif x > ...

  7. 编写高质量代码改善C#程序的157个建议——建议153:若抛出异常,则必须要注释

    建议153:若抛出异常,则必须要注释 有一种必须加注释的场景,即使异常.如果API抛出异常,则必须给出注释.调用者必须通过注释才能知道如何处理那些专有的异常.通常,即便良好的命名也不可能告诉我们方法会 ...

  8. ajax 解析

    1.通过适当的Ajax应用达到更好的用户体验; 2.把以前的一些服务器负担的工作转嫁到客户端,利于客户端闲置的处理能力来处理,减轻服务器和带宽的负担,从而达到节约ISP的空间及带宽租用成本的目的. 二 ...

  9. mongodb driver2.5环境注意事项

    mongodb driver2.5环境注意事项 一.问题: 如果使用vs2012开发就会报这个错误: 未能加载文件或程序集“System.Runtime.InteropServices.Runtime ...

  10. 一文解锁BILIBILI、ACFUN等弹幕网站是如何审核视频

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 人工审核对于A站和B站都是很重要的. AcFun稿件审核通行标准(V1.1) 表明,要审核的东西非常多,除了内容本身的合规性.调性,还有画质音质.撞 ...