第一问:

对B串建立SAM,暴力枚举A的每个子串,在SAM上走,若失配则可行。

第二问:

设g[i][j]表示B串的第i个字符之后最早出现的字符j的位置,暴力枚举A的每个子串,按照g贪心地走,若失配则可行。

第三问:

对B串建立SAM,设f[i][j]表示考虑了A的前i个字符,当前在SAM上的状态为j的最小长度,然后DP。

第四问:

设g[i][j]表示B串的第i个字符之后最早出现的字符j的位置,f[i][j]表示考虑了A的前i个字符,当前在g[]中匹配到了j的最小长度,然后DP。

时间复杂度$O(n^2)$。

  1. #include<cstdio>
  2. #include<cstring>
  3. const int N=2010,S=26;
  4. int n,m,i,j,x,ans1=N,ans2=N,ans3=N,ans4=N;char a[N],b[N];
  5. inline void up(int&a,int b){if(a>b)a=b;}
  6. namespace String{
  7. int tot=1,last=1,pre[N<<1],son[N<<1][S],ml[N<<1],f[N][N<<1];
  8. inline void extend(int w){
  9. int p=++tot,x=last,r,q;
  10. for(ml[last=p]=ml[x]+1;x&&!son[x][w];x=pre[x])son[x][w]=p;
  11. if(!x)pre[p]=1;
  12. else if(ml[x]+1==ml[q=son[x][w]])pre[p]=q;
  13. else{
  14. pre[r=++tot]=pre[q];std::memcpy(son[r],son[q],sizeof son[r]);
  15. ml[r]=ml[x]+1;pre[p]=pre[q]=r;
  16. for(;x&&son[x][w]==q;x=pre[x])son[x][w]=r;
  17. }
  18. }
  19. void work(){
  20. for(i=1;i<=m;i++)extend(b[i]);
  21. for(i=1;i<=n;i++)for(x=1,j=i;j<=n&&j-i+1<ans1;j++){
  22. x=son[x][a[j]];
  23. if(!x)ans1=j-i+1;
  24. }
  25. for(i=0;i<=n;i++)for(j=1;j<=tot;j++)f[i][j]=N;
  26. for(f[0][1]=i=0;i<n;i++)for(j=1;j<=tot;j++)if(f[i][j]<N){
  27. up(f[i+1][j],f[i][j]);
  28. if(son[j][a[i+1]])up(f[i+1][son[j][a[i+1]]],f[i][j]+1);else up(ans3,f[i][j]+1);
  29. }
  30. }
  31. }
  32. namespace Sequence{
  33. int g[N][S],f[N][N];
  34. void work(){
  35. for(j=0;j<S;j++)g[m][j]=-1;
  36. for(i=m;i;i--)for(j=0;j<S;j++)if(b[i]==j)g[i-1][j]=i;else g[i-1][j]=g[i][j];
  37. for(i=1;i<=n;i++)for(x=0,j=i;j<=n&&j-i+1<ans2;j++){
  38. x=g[x][a[j]];
  39. if(x<0)ans2=j-i+1;
  40. }
  41. for(i=0;i<=n;i++)for(j=0;j<=m;j++)f[i][j]=N;
  42. for(f[0][0]=i=0;i<n;i++)for(j=0;j<=m;j++)if(f[i][j]<N){
  43. up(f[i+1][j],f[i][j]);
  44. if(~g[j][a[i+1]])up(f[i+1][g[j][a[i+1]]],f[i][j]+1);else up(ans4,f[i][j]+1);
  45. }
  46. }
  47. }
  48. int main(){
  49. scanf("%s%s",a+1,b+1),n=strlen(a+1),m=strlen(b+1);
  50. for(i=1;i<=n;i++)a[i]-='a';
  51. for(i=1;i<=m;i++)b[i]-='a';
  52. String::work();
  53. Sequence::work();
  54. if(ans1==N)ans1=-1;
  55. if(ans2==N)ans2=-1;
  56. if(ans3==N)ans3=-1;
  57. if(ans4==N)ans4=-1;
  58. return printf("%d\n%d\n%d\n%d",ans1,ans2,ans3,ans4),0;
  59. }

  

BZOJ4032 : [HEOI2015]最短不公共子串的更多相关文章

  1. bzoj4032: [HEOI2015]最短不公共子串(SAM+DP)

    4032: [HEOI2015]最短不公共子串 题目:传送门 题解: 陈年老题良心%你赛膜爆嘎爷 当初做题...一眼SAM...结果只会两种直接DP的情况... 情况1: 直接设f[i][j] 表示的 ...

  2. BZOJ4032[HEOI2015]最短不公共子串——序列自动机+后缀自动机+DP+贪心

    题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...

  3. BZOJ4032:[HEOI2015]最短不公共子串(SAM)

    Description 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列” ...

  4. [BZOJ4032][HEOI2015]最短不公共子串(Trie+DP)

    在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之——被它们虐. 操作一:对A,B分别建SAM,暴力BFS. 操作二:对B建序列自动机或SAM,A在上面暴力匹配. 操作三:对A,B建 ...

  5. BZOJ4032: [HEOI2015]最短不公共子串(后缀自动机+序列自动机)

    题目描述 在虐各种最长公共子串.子序列的题虐的不耐烦了之后,你决定反其道而行之. 一个串的“子串”指的是它的连续的一段,例如bcd是abcdef的子串,但bde不是. 一个串的“子序列”指的是它的可以 ...

  6. BZOJ4032 [HEOI2015]最短不公共子串 【后缀自动机 + 序列自动机 + dp】

    题目链接 BZOJ4032 题解 首先膜\(hb\) 空手切神题 一问\(hash\),二问枚举 三问\(trie\)树,四问\(dp\) 南二巨佬神\(hb\) 空手吊打自动机 \(orz orz ...

  7. 【BZOJ4032】[HEOI2015]最短不公共子串(后缀自动机,序列自动机)

    [BZOJ4032][HEOI2015]最短不公共子串(后缀自动机,序列自动机) 题面 BZOJ 洛谷 题解 数据范围很小,直接暴力构建后缀自动机和序列自动机,然后直接在两个自动机上进行\(bfs\) ...

  8. bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)

    bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...

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

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

随机推荐

  1. Google Chrome浏览器调试入门————转载只为自己查看方便

    Google Chrome浏览器调试 作为Web开发人员,我为什么喜欢Google Chrome浏览器 [原文地址:http://www.cnblogs.com/QLeelulu/archive/20 ...

  2. 在C/C++程序里打印调用栈信息

    我们知道,GDB的backtrace命令可以查看堆栈信息.但很多时候,GDB根本用不上.比如说,在线上环境中可能没有GDB,即使有,也不太可能让我们直接在上面调试.如果能让程序自己输出调用栈,那是最好 ...

  3. 第一次学习QT

    跟着大神学:http://www.cnblogs.com/tornadomeet/archive/2012/06/25/2561007.html

  4. DButils实现查询和新增

             public static Adttendance DBSql(String data) throws SQLException {     String url = "j ...

  5. HDU 1710 二叉树的遍历 Binary Tree Traversals

    Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  6. poj3026(bfs+prim)

    The Borg is an immensely powerful race of enhanced humanoids from the delta quadrant of the galaxy. ...

  7. HDOJ 1874

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  8. OpenResty(Nginx)+Lua+GraphicsMagick实现缩略图功能

    http://www.hopesoft.org/blog/?p=1188 http://www.imagemagick.org/download/ 2.用法 原始图片是input.jpg,尺寸:160 ...

  9. lambda 表达式

    C++0x 的语法还是比较简单.下面通过几个例子来介绍下. 先是通过 std::for_each 演示一个简单的例子: ? std::for_each 和 lambda 1 2 3 4 5 6 7 8 ...

  10. javascript动态添加form表单元素

    2014年11月7日 17:10:40 之前写过几篇类似的文章,现在看来比较初级,弄一个高级的简单的 情景: 后台要上传游戏截图,截图数量不确定,因此使用动态添加input节点的方法去实现这个效果 主 ...