Codeforces 86C

news/2024/11/17 9:49:41/

自动机+dp
dp[i][j][k]在i节点字符串长度为j最小的未匹配位置k

/f[u]=r,r������u�ĺ�׺��
/last[u]=r,r������u�ĺ�׺�У�������һ������
ÿ����һ����ĸ��״̬ת��һ��
#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
typedef __int64 LL;
const int mod=1e9+9;
const int MN=10*11+10;
const int SZ=4;
int ch[MN][SZ];int val[MN];
int sz,tot;
void init(){tot=1;sz=4;memset(ch[0],0,sizeof(ch[0]));val[0]=0;}
int idx(char c){if(c=='A')return 0;if(c=='G')return 1;if(c=='C')return 2;return 3;
}
void Ins(char *s,int v){int u=0,n=strlen(s);for(int i=0;i<n;i++){int c=idx(s[i]);if(!ch[u][c]){memset(ch[tot],0,sizeof(ch[tot]));val[tot]=0;ch[u][c]=tot++;}u=ch[u][c];}val[u]=n;
}
int f[MN],last[MN],dep[MN];
int getFail(){queue<int> qq;f[0]=0;last[0]=0;dep[0]=0;for(int c=0;c<sz;c++){int u=ch[0][c];if(u){dep[u]=1;f[u]=0;last[u]=0;qq.push(u);}}while(!qq.empty()){int r=qq.front();qq.pop();for(int c=0;c<sz;c++){int u=ch[r][c];if(!u){ch[r][c]=ch[f[r]][c];continue;}dep[u]=dep[r]+1;qq.push(u);int v=f[r];while(v&&!ch[v][c])v=f[v];f[u]=ch[v][c];last[u]=val[f[u]]?f[u]:last[f[u]];//val[u]|=val[f[u]];val[u]=max(val[u],val[f[u]]);}}
}int dp[1000+1][MN][12];
char ss[15];
int main(){#ifdef DouBifreopen("in.cpp","r",stdin);#endif // DouBiint n,m;while(scanf("%d%d",&n,&m)!=EOF){init();for(int i=0;i<m;i++){scanf("%s",ss);Ins(ss,1);}getFail();memset(dp,0,sizeof(dp));dp[0][0][0]=1;for(int i=0;i<n;i++){for(int j=0;j<tot;j++){for(int k=0;k<=dep[j];k++)if(dp[i][j][k]){for(int c=0;c<sz;c++){int v=ch[j][c];if(dep[v]<k+1)continue;if(val[v]>=k+1){dp[i+1][v][0]+=dp[i][j][k];dp[i+1][v][0]%=mod;}else {dp[i+1][v][k+1]+=dp[i][j][k];dp[i+1][v][k+1]%=mod;}}}}}LL ans=0;for(int i=0;i<tot;i++){ans+=dp[n][i][0];ans%=mod;}printf("%I64d\n",ans);}return 0;
}

http://www.ppmy.cn/news/578850.html

相关文章

80*86 指令

实地址模式 保护虚地址模式。 1 实地址&#xff1a; 存储器20位物理地址&#xff1b;1MB&#xff1b;LMSW指令设置机器状态字 MSW中的PE状态&#xff0c;可使 80286进入保护虚地址模式。 2 保护虚地址模式&#xff1a; 设计用来增强 多工 和系统稳定度&#xff0c;像是 内存保…

手机号码格式化得到带86和不带86的号码

/*** 得到不带86开头的号码* * param phoneNumber* return*/ public static String getNoWith86Number(String number) {String regular number;if (StringUtils.isNotBlank(regular)) {// 去掉号while(regular.startsWith("")) {regular regular.substring(1);}//…

leetcode 86.分割链表

leetcode 86.分割链表 题目描述 给定一个链表和一个特定值 x&#xff0c;对链表进行分隔&#xff0c;使得所有小于 x 的节点都在大于或等于 x 的节点之前。 你应当保留两个分区中每个节点的初始相对位置。 示例: 输入: head 1->4->3->2->5->2, x 3 输出: 1…

php 手机号 去掉86,手机号前面的+86是什么意思

手机号前面的86是指中国的国际区号&#xff0c;在国内拨打国内手机&#xff0c;加上“86”和不加是一样的&#xff1b;而国际电话区号&#xff0c;即国际电信联盟根据“E.164”标准分配给各国的代码&#xff1b;所有的号码都是前缀号&#xff0c;也就是说这些号码是用来“拨到”…

德科一星题86

给定一个射击比赛成绩单&#xff0c;包含多个选手若干次射击的成绩分数&#xff0c;请对每个选手按其最高三个分数之和进行降序排名&#xff0c;输出降序排名后的选手id序列 条件如下 1. 一个选手可以有多个射击成绩的分数&#xff0c;且次序不固定 2. 如果一个选手成绩…

Day 86

_Spring技术setter注入 思考&#xff1a;像一个类中传递数据的方式有几种&#xff1f; 普通方法&#xff08;set方法&#xff09;构造方法 思考&#xff1a;依赖注入描述了在容器中建立bean与bean之间的联系关系&#xff0c;如果bean运行需要的是数字或是字符串呢&#xff1f;…

70--86

70 回文数 #include<stdio.h> #include<stdlib.h> #include<string.h> //将n进制转化为10进制整数 int trans(char str[],int n,int len){int i,sum,x;sum0;x1;for(ilen-1;i>0;i--){sum(str[i]-0)*x;x*n;}return sum; } //判断字符串是否回文 int huiw…

X86-64与x86-32

参考链接http://www.admin10000.com/document/3676_2.html x86&#xff0c;或8086是Intel首先开发制造的一种微处理器体系结构的泛称&#xff0c;包括8086、80186、80286、80386以及80486等。 因此其架构被称为“x86”。由于数字并不能作为注册商标&#xff0c;现在Intel把x86-…