【TJOI2017】DNA【后缀自动机】
传送门
稍显窒息的是:这道题只有ATCG四种字符,高中生物知识,,,,,,
后缀自动机的优秀之处在于我从跟节点开始走可以走出所有的子串。所以直接dfs记录一下有没有超出3个就好了。
#include<bits/stdc++.h>
using namespace std;struct node{int ch[6],fail,len,key;
}t[200003];int cnt=1,last=1;
void insert(int x){int p=last;int now=++cnt;//memset(t[now].ch,0,sizeof(t[now].ch));t[now].fail=t[now].len=t[now].key=0;last=cnt;t[now].len=t[p].len+1;t[now].key=1;//t[now].fail=0;for(;p&&!t[p].ch[x];p=t[p].fail)t[p].ch[x]=now;if(!p)t[now].fail=1;else{int q=t[p].ch[x];if(t[q].len==t[p].len+1)t[now].fail=q;else{int tem=++cnt;t[tem]=t[q];t[tem].len=t[p].len+1;t[now].fail=t[q].fail=tem;t[tem].key=0;for(;p&&t[p].ch[x]==q;p=t[p].fail)t[p].ch[x]=tem;}}
}int T;int ans;
char ch[100003],gu[100003];
int first[200003],nxt[200003],to[200003],tot;
void add(int a,int b){nxt[++tot]=first[a];first[a]=tot;to[tot]=b;
}int m;int val[270];
void dfs(int u,int len,int fal){if(len>m){ans+=t[u].key;return;}for(int i=1;i<=4;i++){if(t[u].ch[i]){if(val[gu[len]]==i)dfs(t[u].ch[i],len+1,fal);else if(fal<3)dfs(t[u].ch[i],len+1,fal+1);}}
}
void dfs0(int u){for(int i=first[u];i;i=nxt[i]){int v=to[i];dfs0(v);t[u].key+=t[v].key;}
}
int main(){cin>>T;val['A']=1;val['C']=2;val['T']=3;val['G']=4;while(T--){cnt=1;last=1;tot=0;ans=0;memset(first,0,sizeof(first));scanf("%s",ch+1);scanf("%s",gu+1);int len=strlen(ch+1);m=strlen(gu+1);for(int i=1;i<=len;i++)insert(val[ch[i]]);for(int i=2;i<=cnt;i++)add(t[i].fail,i);dfs0(1);dfs(1,1,0);cout<<ans<<'\n';for(int i=1;i<=cnt;i++)memset(t[i].ch,0,sizeof(t[i].ch)),t[i].fail=t[i].key=t[i].len=0;}return 0;
}
【TJOI2017】DNA【后缀自动机】相关推荐
- [TJOI2017]DNA --- 后缀数组
[TJOI2017]DNA 题目描述 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S, 有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列S,任意修改其中不超过3个 ...
- BZOJ4892: [Tjoi2017]dna
BZOJ4892: [Tjoi2017]dna Description 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列S, 有这个序列的碱基序列就会表现出喜欢吃藕的性状. 但是研究人员发现 ...
- P3763 [TJOI2017]DNA (FFT)
原题题面 加里敦大学的生物研究所,发现了决定人喜不喜欢吃藕的基因序列 SSS,有这个序列的碱基序列就会表现出喜欢吃藕的性状,但是研究人员发现对碱基序列 SSS,任意修改其中不超过 3 个碱基,依然能够 ...
- 【POJ1509】Glass Beads 【后缀自动机】
题意 给出一个字符串,求它的最小表示法. 分析 这个题当然可以用最小表示法做啦!但是我是为了学后缀自动机鸭! 我们把这个字符串长度乘二,然后建SAM,然后在SAM上每次跑最小的那个字母,找出长度为n的 ...
- bzoj 2946 [Poi2000]公共串——后缀自动机
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2946 对每个串都建一个后缀自动机,然后 dfs 其中一个自动机,记录同步的话在别的自动机上走 ...
- 后缀自动机 ---- P3804 【模板】后缀自动机(求每个等价类最长串的出现次数)
后缀自动机一些关键点 首先后缀自动机上面每个节点都是一个等价类并且是最长的字符串的结尾 后缀自动机上的fail链反建就是parent tree,下面是SAM和Parent tree的构造 对于这道模板 ...
- 洛谷P3966 [TJOI2013]单词(后缀自动机)
传送门 统计单词出现次数--为啥大家都是写AC自动机的嘞--明明后缀自动机也能做的说-- 统计出现次数这个就直接按长度排序然后做个dp就好,这是SAM的板子的要求啊,不提了 然后考虑怎么让所有串之间隔 ...
- hihocoder 后缀自动机专题
一.后缀自动机基本概念的理解 1.首先后缀自动机的状态是由子串的endpos来决定的 子串的endpos是指一个子串可以在原字符串的哪些位置进行匹配, endpos构成的不同集合划分成不同的状态 关于 ...
- BZOJ3998: [TJOI2015]弦论(后缀自动机,Parent树)
Description 对于一个给定长度为N的字符串,求它的第K小子串是什么. Input 第一行是一个仅由小写英文字母构成的字符串S 第二行为两个整数T和K,T为0则表示不同位置的相同子串算作一个. ...
最新文章
- 【OkHttp】Android 项目导入 OkHttp ( 配置依赖 | 配置 networkSecurityConfig | 配置 ViewBinding | 代码示例 )
- 基于Spring Cloud实现微服务前后端系统
- SpringSecurity集中式整合之授权操作
- mac securecrt程序无响应_终端仿真软件SecureCRT和Xshell,让运维工作更轻松
- 2个字段并在一次插入一个字段里面_elasticsearch外用与内观(二)-当插入文档时,elasticsearch都在做什么...
- 自定义手势--输入法手势技术
- 教你在Kubernetes中快速部署ES集群
- 防仿百度图片背景色php,基于jQuery实现仿百度首页换肤背景图片切换代码_jquery...
- m_Orchestrate learning system---三十一、模板和需求的关系
- 简单的签到代码_签到功能,用 MySQL 还是 Redis ?
- SpringMVC @ControllerAdvice 注解的官方解释
- java万年历报告_java万年历设计报告
- 计算机相关英语词汇ppt,计算机专业英语词汇新.ppt
- R语言-基于集波士顿住房
- hadoop启动cgroups,centos6.5+hadoop2.7.2
- 手把手教你制作炫酷的PCB板3D效果图
- java 获取视频时间_java 获取视频时间
- JS 获取第一个和最后一个,子节点、子元素
- 计算机2010基础试题,2010年国硕士研究生入学统一考试计算机基础试题及答案
- 香港主机CDN加速,让您的网站速度飙升