博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 4032: [HEOI2015]最短不公共子串【dp+SAM】
阅读量:5212 次
发布时间:2019-06-14

本文共 2568 字,大约阅读时间需要 8 分钟。

第一、二问:

就是最小的最长公共长度+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]=(a[i]==b[j]?f[i-1][j-1]+1:f[i][j-1]),注意这里更新最小公共长度的时候,如果f[i][j]==i就不能更新,因为不能从前面随便新加的字符,后面加的不能保证不相等
第三问:
对b串建SAM,设g[i]为匹配到SAM上点i时的最短长度,然后枚举a的字符,如果能转移就转移,否则用失配位置更新答案
第四问:
同上,不用SAM,设c[i][j]为b串位置i后面第一个字符j的位置,当成SAM的ch转移,然后dp同上

#include
#include
#include
using namespace std;const int N=4005;int n,m,f[N][N],ans,ch[N][26],fa[N],tot=1,cur=1,la,dis[N],g[N],l[26],c[N][26];char a[N],b[N];void ins(int c,int id){ la=cur; dis[cur=++tot]=id; int p=la; for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=cur; if(!p) fa[cur]=1; else { int q=ch[p][c]; if(dis[q]==dis[p]+1) fa[cur]=q; else { int nq=++tot; dis[nq]=dis[p]+1; memcpy(ch[nq],ch[q],sizeof(ch[q])); fa[nq]=fa[q]; fa[q]=fa[cur]=nq; for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq; } }}int main(){ scanf("%s%s",a+1,b+1); n=strlen(a+1),m=strlen(b+1); ans=1e9; for(int i=1;i<=n;i++) { int mx=0; for(int j=1;j<=m;j++) { if(a[i]==b[j]) f[i][j]=f[i-1][j-1]+1; mx=max(mx,f[i][j]); } if(mx!=i) ans=min(ans,mx+1); } printf("%d\n",ans>n?-1:ans); ans=1e9; memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) { int mx=0; for(int j=1;j<=m;j++) { if(a[i]==b[j]) f[i][j]=f[i-1][j-1]+1; else f[i][j]=f[i][j-1]; mx=max(mx,f[i][j]); } if(mx!=i) ans=min(ans,mx+1); } printf("%d\n",ans>n?-1:ans); for(int i=1;i<=m;i++) ins(b[i]-'a',i); ans=1e9; memset(g,0x3f,sizeof(g)); g[1]=0; for(int i=1;i<=n;i++) for(int j=1;j<=tot;j++) { if(!ch[j][a[i]-'a']) ans=min(ans,g[j]+1); else g[ch[j][a[i]-'a']]=min(g[ch[j][a[i]-'a']],g[j]+1); } printf("%d\n",ans>n?-1:ans); for(int i=m;i>=0;i--) { for(int j=0;j<26;j++) c[i][j]=l[j]; l[b[i]-'a']=i; } ans=1e9; memset(g,0x3f,sizeof(g)); g[0]=0; for(int i=1;i<=n;i++) for(int j=m;j>=0;j--) { if(!c[j][a[i]-'a']) ans=min(ans,g[j]+1); else g[c[j][a[i]-'a']]=min(g[c[j][a[i]-'a']],g[j]+1); } printf("%d\n",ans>n?-1:ans); return 0;}

转载于:https://www.cnblogs.com/lokiii/p/10749943.html

你可能感兴趣的文章
ajax向后台传递数组
查看>>
剑指offer系列14:包含min函数的栈
查看>>
疯狂JAVA16课之对象与内存控制
查看>>
[转载]树、森林和二叉树的转换
查看>>
WPF移动Window窗体(鼠标点击左键移动窗体自定义行为)
查看>>
1593: [Usaco2008 Feb]Hotel 旅馆 (线段树)
查看>>
软件测试-----Graph Coverage作业
查看>>
django ORM创建数据库方法
查看>>
创建Oracle synonym 详解
查看>>
php7 新特性整理
查看>>
RabbitMQ、Redis、Memcache、SQLAlchemy
查看>>
linux查看端口占用
查看>>
hdu - 1226 超级密码 (bfs)
查看>>
Qt重写paintEvent方法遇到的问题
查看>>
Sql常见面试题 受用了
查看>>
知识不是来炫耀的,而是来分享的-----现在的人们却…似乎开始变味了…
查看>>
CSS背景颜色、背景图片、平铺、定位、固定
查看>>
口胡:[HNOI2011]数学作业
查看>>
我的第一个python web开发框架(29)——定制ORM(五)
查看>>
Combination Sum III -- leetcode
查看>>