DNA repair HDU
来源:互联网 发布:用递归算法计算斐波拉 编辑:程序博客网 时间:2024/06/16 15:51
#include<bits/stdc++.h>#include<stdio.h>#include<algorithm>#include<queue>#include<string.h>#include<iostream>#include<math.h>#include<set>#include<map>#include<vector>#include<iomanip>using namespace std;#define ll long long#define ull unsigned long long#define pb push_back#define FOR(a) for(int i=1;i<=a;i++)const int inf=0x3f3f3f3f;const int maxn=1e6+7; const long long mod=1e9+7;const int sigma=4;ll ans;char s[1111];int dp[1111][1111];//想转移到长度i状态j,最少修改次数struct automata{ int ch[maxn][sigma]; int val[maxn]; int f[maxn]; int sz; int idx(char x){if(x=='A')return 0;if(x=='C')return 1;if(x=='G')return 2;return 3;} int newnode(){ memset(ch[sz],0,sizeof(ch[sz])); f[sz]=val[sz]=0; return sz++; } void init(){ memset(val,0,sizeof(val)); sz=0; newnode(); } void insert(char *s,int v){ int u=0; int len=strlen(s); for(int i=0;i<len;i++){ int id=idx(s[i]);//s[i]-'a'; if(!ch[u][id])ch[u][id]=newnode(); u=ch[u][id]; } val[u]=v;} void build(){ queue<int>q; q.push(0); while(!q.empty()){ int u=q.front();q.pop(); if(val[f[u]]){ val[u]=val[f[u]]; } for(int i=0;i<sigma;i++){ int v=ch[u][i]; if(!v)ch[u][i]=ch[f[u]][i]; else q.push(v); if(u&&v)f[v]=ch[f[u]][i]; } } } void solve(){int len=strlen(s);for(int i=0;i<=len;i++)for(int j=0;j<sz;j++)dp[i][j]=inf;dp[0][0]=0;for(int i=0;i<len;i++){for(int j=0;j<sz;j++){if(dp[i][j]!=inf){//状态可达for(int k=0;k<4;k++){if(val[ch[j][k]])continue;//病毒串,不转移int tmp;if(idx(s[i])==k)tmp=dp[i][j];//不改转移else tmp=dp[i][j]+1;//改一个转移dp[i+1][ch[j][k]]=min(dp[i+1][ch[j][k]],tmp);}}}}int ans=inf;for(int i=0;i<sz;i++)ans=min(dp[len][i],ans);if(ans==inf)printf("-1\n");else printf("%d\n",ans);}}ac; char buf[60];int n;int main(){int kase=0;while(~scanf("%d",&n) && n){ac.init();for(int i=1;i<=n;i++){scanf("%s",buf);ac.insert(buf,1);}scanf("%s",s);ac.build();printf("Case %d: ",++kase);ac.solve();}}基本上自动机DP的状态关系算是学到一些了,搞搞别的吧
阅读全文
0 0
- hdu 2457 DNA repair
- HDU 2457 DNA repair
- HDU - 2457 DNA repair
- HDU 2457DNA repair
- DNA repair HDU
- hdu 2457 DNA repair(AC自动机+DP)
- HDU 2457 DNA repair(AC自动机+DP)
- 【HDU】2457 DNA repair AC自动机+DP
- hdu 2457 DNA repair ac自动机+dp
- Poj 3691 & Hdu 2457 DNA repair
- Hdu 2457 DNA repair (ac自动机+dp)
- [AC自动机+dp] hdu 2457 DNA repair
- hdu 2457 DNA repair(AC自动机+DP)
- hdu 2457 DNA repair (ac自动机+dp)
- hdu 2457 DNA repair(ac自动机+dp)
- hdu DNA repair(AC自动机+DP)
- HDU 2457 DNA repair AC自动机+DP
- HDU - 2457 DNA repair AC自动机+dp
- oracle-profile详细理解--2017-08-20
- 操作系统文件管理
- Java面试题与答案(1)
- eclipse中Maven的配置
- Mysql的字段类型,查询语句,高级操作
- DNA repair HDU
- Redis系列学习(四)之jedis工具类
- DIV标签设置浮动后,对下一个DIV标签width的影响
- 《七大排序算法》(二)之简单选择排序(Java实现)
- 【JZOJ5260】【GDOI2018模拟8.12】区间第k小
- 漫谈大数据
- 利用PHP GD库生成位图
- 【BZOJ1085】【SCOI2005】骑士精神(IDA*)
- Win10/Win8使用ADB连接不上Android设备,设备管理器出现黄色叹号解决方案