`
darren_nizna
  • 浏览: 72777 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

[PKU/POJ][2778][DNA Sequence][AC自动机]

J# 
阅读更多

利用AC自动机构建一个 DFA, 该 DFA 不经过任何模式串。然后问题转化为在一个图上找经过 n 条边的路径条数。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef long long LL;
int n, m, cnt= 0;

LL mat[200][200]= {0};

struct Node{
	int next[4];
	int fail, flag;
	void init(){
		for( int i= 0; i< 4; ++i ) next[i]= 0;
		fail= -1; flag= 0; }
}tb[200];

inline int toInt( char ch ){
	switch( ch ){
		case 'A': return 0;
		case 'T': return 1;
		case 'G': return 2;
		case 'C': return 3;
	}
}

void insert( char* s ){
	int rt= 0;
	while( *s ){
		int t= toInt( *s );
		
		if( tb[rt].next[t]== 0 ){
			tb[++cnt].init();
			tb[rt].next[t]= cnt;
		}
		rt= tb[rt].next[t]; s++;
	}
	tb[rt].flag= 1;
}

char str[15];

int que[200], head, tail;
void bfs(){
	head= tail= 0; que[0]= 0;
	
	int p, q;
	while( head<= tail ){
		int now= que[head++];
		
		for( int t= 0; t< 4; ++t )
		if( tb[now].next[t] ){
			p= tb[now].next[t]; q= tb[now].fail;
			while( q!= -1 && !tb[q].next[t] ) q= tb[q].fail;
			if( q== -1 ) tb[p].fail= 0;
			else{
				tb[p].fail= tb[q].next[t];
				tb[p].flag|= tb[ tb[p].fail ].flag;
			}
			que[++tail]= p;
		}
		else{
			q= tb[now].fail;
			while( q!= -1 && !tb[q].next[t] ) q= tb[q].fail;
			
			if( q== -1 ) tb[now].next[t]= 0;
			else tb[now].next[t]= tb[q].next[t];
		}
	}
}

inline void mult( LL x[200][200], LL y[200][200] ){
	LL z[200][200];
	for( int i= 0; i<= cnt; ++i )
	for( int j= 0; j<= cnt; ++j ){
		z[i][j]= 0;
		for( int k= 0; k<= cnt; ++k )
		z[i][j]+= x[i][k]* y[k][j];
		
		z[i][j]%= 100000;
	}
	for( int i= 0; i<= cnt; ++i )
	for( int j= 0; j<= cnt; ++j ) y[i][j]= z[i][j];
}

int main(){
	scanf("%d%d",&m, &n ); tb[0].init();
	for( int i= 0; i< m; ++i ){
		scanf("%s", str );
		insert( str );
	}
	
	bfs();
	for( int i= 0; i<= cnt; ++i )
	if( tb[i].flag== 0 )
	for( int j= 0; j< 4; ++j )
	if( tb[ tb[i].next[j] ].flag== 0 ) mat[i][ tb[i].next[j] ]++;
	
	LL ans[200][200]= {0};
	for( int i= 0; i<= cnt; ++i ) ans[i][i]= 1;
	while( n ){
		if( n& 1 ) mult( mat, ans );
		mult( mat, mat ); n>>= 1;
	}
	
	LL res= 0;
	for( int i= 0; i<= cnt; ++i )
	if( tb[i].flag== 0 ) res+= ans[0][i];
	
	printf("%I64d\n", res% 100000 );

	return 0;
}

 

1
1
分享到:
评论

相关推荐

    PKU 、POJ ACM/ICPC300多题的代码

    标题“PKU 、POJ ACM/ICPC300多题的代码”指的是北京大学(PKU)和编程在线评测平台POJ上收集的300多道ACM/ICPC(国际大学生程序设计竞赛)比赛题目解题代码。这个压缩包包含了解决这些竞赛问题的算法和程序实现,是...

    PKU_poj 1197

    ACM PKU_poj 1197 仓库问题源代码,愿与大家共享。若谁更好的代码,多谢提供。

    PKU_poj 1001~1009

    标题“PKU_poj 1001~1009”揭示了这是一组与北京大学(Peking University)编程竞赛平台POJ相关的解决方案。在这个压缩包中,包含了从问题1001到1009的C++源代码,表明这些代码已经过验证并成功解决了对应的算法问题。...

    POJ动态规划题目全面总结

    PKU Online Judge上面很全面的动态规划试题总结。动态规划是ACM考点中最重要的一大类算法之一,对于工作人员来说,动态规划也是实际开发中经常会遇到的算法。这是POJ上面很多DP题目的总结与深刻分析。利于算法学习,...

    POJ 300多题AC代码

    【标题】"POJ 300多题AC代码"涉及的是编程竞赛中的问题解决和算法实践,主要针对ACM(国际大学生程序设计竞赛)的比赛训练。POJ(Problemset Online Judge)是一个在线的编程练习平台,提供了丰富的编程题目供参赛者...

    pku(poj)--2494--Acid Text--java代码

    根据给定的文件信息,我们可以总结出以下关于POJ(PKU)问题2494“Acid Text”以及其Java代码实现的关键知识点: ### 1. POJ(PKU)2494:Acid Text POJ(Peking University Online Judge)是北京大学的一个在线...

    pku_poj_2187.rar_poj 2187_凸包问题

    标题中的“pku_poj_2187.rar_poj 2187_凸包问题”表明这是一个关于北京大学(Peking University, PKU)编程竞赛平台POJ上的第2187题,题目主要涉及凸包问题。描述中的“O(nlogn)凸包问题 poj2187”提示我们解决这个...

    pku1088.rar_pku 10_pku 1088_poj 1088

    标题中的“pku1088.rar_pku 10_pku 1088_poj 1088”指的是北京大学(Peking University, PKU)编程竞赛中的第1088题,也称为POJ(Peking University Online Judge)的1088题。这个题目在编程竞赛社区中通常有一个特定的...

    POJ上一些已经AC的代码

    描述中提到的“acm.pku.edu.cn/OnlineJudge”是POJ的官方网站,它提供了大量的编程题目供参赛者练习和挑战。"已经通过的代码"指的是在该平台上已经成功解决了特定问题并获得AC状态的源代码。 标签中提到了“ACM”,...

    POJ.rar_pku ac_pku.1050

    标题中的"POJ.rar_pku ac_pku.1050"暗示了这是一个与北京大学(Peking University, 简称PKU)编程竞赛相关的压缩文件,其中包含了作者通过验证(Passed All Cases, 简称AC)的代码,具体是针对PKU题目编号1050的问题。...

    pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11

    标题中的“pku1151.rar_Atlantis_pku 11_poj Atlant_poj Atlantis_poj11”似乎是指北京大学(Peking University, PKU)编程竞赛中的一道题目,编号为1151,与“Atlantis”这个主题相关。这道题目在多个平台上也被提及...

    poj3252.rar_pku 3252_poj32

    标题中的"poj3252.rar_pku 3252_poj32"表明这是一个与编程竞赛相关的资源,具体来说是北京大学(PKU)ACM竞赛中的问题3252。"poj"通常指的是"Programming Online Judge",这是一个在线编程比赛平台,而"Pku"则代表...

    poj 130题 acm pku

    【标题】"poj 130题 acm pku" 涉及的是ACM(国际大学生程序设计竞赛)中的PKU(北京大学)在线判题系统POJ(Problem Online Judge)的相关题目。ACM/ICPC(International Collegiate Programming Contest)是全球...

    poj acm的AC解题报告

    POJ(PKU Online Judge)作为北京大学维护的一个在线评测系统,是许多ACMer练习和提交代码的重要平台。在这个平台上,AC的解题报告是衡量一个程序员算法理解和实现能力的关键指标。 一、ACM竞赛编程基础 ACM竞赛...

    PKU POJ 1162 Building with Blocks解题报告

    ### PKU POJ 1162 Building with Blocks 解题报告 #### 题目概述 本题名为“Building with Blocks”,属于经典的积木搭建问题。题目要求利用一定数量的基本单位积木,搭建出特定的三维形状。积木的种类不超过12种,...

    poj(PKU-2314-POJ language

    根据提供的文件信息,我们可以分析出该段代码是用于解决POJ平台上的2314题的一种解决方案,主要涉及到了变量管理、表达式处理等方面。下面将详细解释代码中的关键概念和实现逻辑。 ### 关键概念解析 #### Variable...

    北大oj题集(清晰版,poj上原题集)

    “北京大学程序在线评测系统”是一个免费的公益性网上程序设计题库,网址为http://poj.grids.cn/ 及 http://acm.pku.edu.cn/JudgeOnline,它包含2000多道饶有趣味的程序设计题,题目大部分来自ACM国际大学生程序设计...

    北大POJ初级-所有题目AC代码+解题报告

    北京大学(Peking University, 简称PKU)的POJ(Peking University Online Judge)是一个为计算机科学爱好者和学生提供在线编程训练的平台。这个资源集合了北大POJ初级阶段的所有题目,包含已通过(Accepted, AC)的...

    pku 123 题目代码

    标题 "pku 123 题目代码" 暗示了这是一个与北京大学(Peking University)编程竞赛(PKU ACM/ICPC)相关的代码集合,可能包含了参赛者为解决PKU ACM在线判题系统(PJU POJ)上的123道题目所编写的程序。POJ是北京大学维护...

    pku poj 2406

    #include using namespace std; #define M 1000000 char t[M+1],p[M+1]; int lent,lenp; bool kmp(char *t,char *p) { int i,j; for(i=lenp,j=0;i;i++) { if(t[i]!=p[j]) return false;...}

Global site tag (gtag.js) - Google Analytics