博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P3763 [TJOI2017]DNA(后缀自动机)
阅读量:5730 次
发布时间:2019-06-18

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

 

好像用SAM写的很少诶……

其实我一开始也没想到要用SAM的……主要是没有想到找的时候可以dfs……

首先建一个SAM,然后跑一遍dfs,枚举一下下一位,如果相同直接继续,否则就花费一次次数来改变它,保证改变次数小于等于3就行了

1 // luogu-judger-enable-o2 2 //minamoto 3 #include
4 #include
5 #include
6 using namespace std; 7 const int N=1e6+5; 8 int cnt[N<<1],fa[N<<1],ch[N<<1][4],l[N<<1],last,tot; 9 char s[N];int c[N],a[N],ans,m,val[N];10 void ins(int c){11 int p=last,np=++tot;last=np,l[np]=l[p]+1,cnt[np]=1;12 for(;p&&!ch[p][c];p=fa[p]) ch[p][c]=np;13 if(!p) fa[np]=1;14 else{15 int q=ch[p][c];16 if(l[q]==l[p]+1) fa[np]=q;17 else{18 int nq=++tot;l[nq]=l[p]+1;19 memcpy(ch[nq],ch[q],sizeof(ch[q]));20 fa[nq]=fa[q],fa[q]=fa[np]=nq;21 for(;ch[p][c]==q;p=fa[p]) ch[p][c]=nq;22 }23 }24 }25 inline void calc(){26 memset(c,0,sizeof(c));27 for(int i=1;i<=tot;++i) ++c[l[i]];28 for(int i=1;i<=tot;++i) c[i]+=c[i-1];29 for(int i=1;i<=tot;++i) a[c[l[i]]--]=i;30 for(int i=tot,p;i;--i)31 p=a[i],cnt[fa[p]]+=cnt[p];32 }33 void dfs(int p,int len,int j){34 if(len>m) return (void)(ans+=cnt[p]);35 for(int i=0;i<4;++i){36 if(!ch[p][i]) continue;37 // val[s[len]]==i?dfs(ch[p][i],len+1,j):j<3?dfs(ch[p][i],len+1,j+1):(void)(1);38 if(val[s[len]]==i) dfs(ch[p][i],len+1,j);39 else if(j<3) dfs(ch[p][i],len+1,j+1);40 }41 }42 int main(){43 // freopen("testdata.in","r",stdin);44 val['T']=0,val['A']=1,val['C']=2,val['G']=3;45 int T;scanf("%d",&T);46 while(T--){47 memset(ch,0,sizeof(ch)),memset(cnt,0,sizeof(cnt));48 last=tot=1,ans=0;49 scanf("%s",s+1);int len=strlen(s+1);50 for(int i=1;i<=len;++i) ins(val[s[i]]);51 calc();52 scanf("%s",s+1),m=strlen(s+1);53 dfs(1,1,0);printf("%d\n",ans);54 }55 return 0;56 }

 

转载于:https://www.cnblogs.com/bztMinamoto/p/9643215.html

你可能感兴趣的文章
《网站情感化设计与内容策略》一1.6 情感和记忆
查看>>
pandas 的Series 里经常会出现DatetimeIndex这个类
查看>>
SQL SERVER 2012 只能识别20个CPU的问题
查看>>
【单调队列】【P1776】宝物筛选
查看>>
使用shell脚本生成数据库markdown文档
查看>>
centos和pycharm中取绝对路径的差别
查看>>
ext2磁盘布局
查看>>
MySql数据库2【常用命令行】
查看>>
安装、进程-云计算学习笔记---hadoop的简介,以及安装,用命令实现对hdfs系统进行文件的上传下载-by小雨...
查看>>
动态规划---->货郎担问题
查看>>
添加虚拟子网
查看>>
Ubuntu 12.04 root用户登录设置
查看>>
存储过程点滴
查看>>
Maven编译跳过test的设置
查看>>
SQLyog图形化l数据库的操作和学习
查看>>
raspbian 怎么才能有声音?
查看>>
[LeetCode]22.Generate Parentheses
查看>>
《数据结构》—— 线性表(上)
查看>>
WEB前端 CSS选择器
查看>>
计算A/B Test需要的样本量
查看>>