hdu 6086 -- Rikka with String(AC自动机 + 状压DP)

题目链接

 

Problem Description
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some math tasks to practice. There is one of them:

Yuta has n 01 strings si, and he wants to know the number of 01 antisymmetric strings of length 2L which contain all given strings si as continuous substrings.

01 string s is antisymmetric if and only if s[i]s[|s|i+1] for all i[1,|s|].

It is too difficult for Rikka. Can you help her?

In the second sample, the strings which satisfy all the restrictions are 000111,001011,011001,100110.

 

Input
The first line contains a number t(1t5), the number of the testcases. 

For each testcase, the first line contains two numbers n,L(1n6,1L100)

Then n lines follow, each line contains a 01 string si(1|si|20).

 

Output
For each testcase, print a single line with a single number -- the answer modulo 998244353.

 

Sample Input
2
2 2
011
001
2 3
011
001

 

Sample Output
1
4
题意:反对称:对于一个长为2*N的串s[0~2*N-1],s[i]^s[2*N-1-i]=1 。现在有n个01串,求有多少个长为2*L的并且包含这n个串的 反对称01串?
思路:对于一个串包含在2*L的01串中,那么这个串要么在2*L的前半部分,要么后半部分,或者跨越中间,如果在后半部分,则需要找到其在前半部分的反对称01串,对于跨越中间的01串,则需要找到其在前面部分的串,例如:0 | 11,以竖线作为串中间,那么如果前面部分如果以00结束,那么一定含有 011这个串。把每个串的所有形式放入AC自动机对应的tire树中,然后状压递推。
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <string>
using namespace std;
const int mod=998244353;
const int N=2005;
struct Node{int id;Node *fail;Node *son[2];int tag1,tag2;
}node[N];
queue<Node *>q;
int tot;
int dp[2][2005][64];void insert1(string s,int id)
{int len=s.length();Node *now=&node[0];for(int i=0;i<len;i++){int x=s[i]-'0';if(now->son[x]==NULL) now->son[x]=&node[tot++];now=now->son[x];}now->tag1|=(1<<id);
}
void insert2(string s,int id)
{int len=s.length();Node *now=&node[0];for(int i=0;i<len;i++){int x=s[i]-'0';if(now->son[x]==NULL) now->son[x]=&node[tot++];now=now->son[x];}now->tag2|=(1<<id);
}
void init()
{for(int i=0;i<N;i++){node[i].id=i;node[i].fail=NULL;node[i].son[0]=node[i].son[1]=NULL;node[i].tag1=node[i].tag2=0;}
}
void setFail()
{Node* root=&node[0];q.push(root);while(!q.empty()){Node* now=q.front(); q.pop();for(int i=0;i<2;i++){if(now->son[i]){Node* p=now->fail;while(p && (!(p->son[i]))) p=p->fail;now->son[i]->fail=(p)?(p->son[i]):(root);now->son[i]->tag1|=now->son[i]->fail->tag1;now->son[i]->tag2|=now->son[i]->fail->tag2;q.push(now->son[i]);}else now->son[i]=(now!=root)?now->fail->son[i]:(root);}}
}
void print()
{Node* now=&node[0];queue<Node*>qq;qq.push(now);while(!qq.empty()){now=qq.front(); qq.pop();cout<<"Y:"<<now->id<<" ";for(int i=0;i<2;i++){if(now->son[i]) qq.push(now->son[i]),cout<<now->son[i]->id<<" ";else cout<<"NULL"<<" ";}cout<<endl;}
}
int main()
{///cout << "Hello world!" << endl;
    int t; cin>>t;while(t--){init();tot=1;int n,L; scanf("%d%d",&n,&L);for(int i=0;i<n;i++){string s; cin>>s;insert1(s,i);string t=s;reverse(t.begin(),t.end());int len=s.length();for(int j=0;j<len;j++)t[j]=(char)((t[j]-'0')^1+'0');insert1(t,i);int mnLen=min(len,L);for(int j=0;j<mnLen;j++){int f=1;for(int l=j,r=j+1; l>=0&&r<len; l--,r++){if((s[l]^s[r])==0) { f=0; break; }}if(!f) continue;t=s.substr(0,j+1);for(int k=2*j+2;k<len;k++){t=(char)((s[k]-'0')^1+'0')+t;}insert2(t,i);}}///print();
       setFail();memset(dp,0,sizeof(dp));dp[0][0][0]=1;int cn=0,stu=(1<<n);for(int i=0;i<L;i++){int c=cn^1;memset(dp[c],0,sizeof(dp[c]));for(int j=0;j<tot;j++){for(int s=0;s<stu;s++){if(!dp[cn][j][s]) continue;if(i<L-1)for(int k=0;k<2;k++){int x=node[j].son[k]->id;int tag=node[x].tag1;dp[c][x][s|tag]=(dp[c][x][s|tag]+dp[cn][j][s])%mod;}elsefor(int k=0;k<2;k++){int x=node[j].son[k]->id;int tag=node[x].tag1|node[x].tag2;dp[c][x][s|tag]=(dp[c][x][s|tag]+dp[cn][j][s])%mod;}}}cn=c;}int ans=0;for(int i=0;i<tot;i++){ans=(ans+dp[cn][i][stu-1])%mod;}printf("%d\n",ans);}return 0;
}

 

 

转载于:https://www.cnblogs.com/chen9510/p/7406636.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

课堂动手动脑问题

对于随机数&#xff0c;java通过Math.random&#xff08;&#xff09;来实现&#xff0c;比如要得到一个随机数我们可以int a&#xff1b; a&#xff08;int&#xff09;Math.random();但对于随机数&#xff0c;它是从0到1之间的数&#xff0c;所以必须通过int把它转为整数&…

GNU/Linux下有多少是GNU的?

导读&#xff1a;一个葡萄牙的学生写了一篇文章 《How much GNU is there in GNU/Linux?》由酷壳网的陈皓整理编译为《GNU/Linux下有多少是GNU的》。这篇文章主要分布了今年4月份的Ubuntu Natty的Linux分发包。其主要是用代码行来做的分析&#xff0c;用两个饼图对比分析。 内…

便携式三星mysql_JDBC链接mysql - 三星蓝

package chp07;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;public classJDBC_Test {//创建静态全局变量staticConnection conn;staticStatement st;public static voidmain(Stri…

C++ 类、对象、class

一、对象初始化 1.不能在类声明中对数据成员初始化&#xff0c;因为类只是一个抽象类型&#xff0c;不占存储空间&#xff0c;无处容纳数据。 2.若某类的数据成员都是public&#xff0c;则可以像结构体一样初始化&#xff0c;如 Time t{12,21,04}&#xff1b; 若数据成员有priv…

Unity 富文本

参考链接&#xff1a;http://www.ceeger.com/Manual/StyledText.html 首先要说的是不仅仅ugui的text组件支持富文本&#xff0c;Debug.Log也是支持的 Debug.Log("<color#ffff00ff><b>爱生活</b></color> <color#00ffffff><b> 爱海澜&…

Web项目替换jar包中的文件的方法

经常遇到这样的问题&#xff0c;需要修改jar包中的方法。应该如何做&#xff1f; 1、有些很人性化的框架jar包&#xff0c;比如SpringSecurity&#xff0c;可以修改配置文件指定一个新建的类&#xff0c;让类实现Jar包中的对应的接口就好了。 2、大部分的jar包都不会有这么方便…

程序员技术练级攻略

导读&#xff1a;本文是由陈皓和他的一位朋友Mailper合作完成&#xff0c;原名叫《Build Your Programming Technical Skills》&#xff0c;本文分享了Mailper和作者个人的学习经历。每个程序员都希望自己能顺利的升级到高的层次&#xff0c;您不妨按照下面的方法去做。 前言 你…

Linux shell 之 提取文件名和目录名的一些方法

很多时候在使用Linux的shell时&#xff0c;我们都需要对文件名或目录名进行处理&#xff0c;通常的操作是由路径中提取出文件名&#xff0c;从路径中提取出目录名&#xff0c;提取文件后缀名等等。例如&#xff0c;从路径/dir1/dir2/file.txt中提取也文件名file.txt&#xff0c…

bzoj 2752: [HAOI2012]高速公路(road)

Description Y901高速公路是一条重要的交通纽带&#xff0c;政府部门建设初期的投入以及使用期间的养护费用都不低&#xff0c;因此政府在这条高速公路上设立了许多收费站。Y901高速公路是一条由N-1段路以及N个收费站组成的东西向的链&#xff0c;我们按照由西向东的顺序将收费…

搭建DNS主、从服务实验

此次我们的口号是&#xff1a;简单、有趣上手DNS服务博主是一个言出必行de好人&#xff0c;&#xff08;正经脸&#xff09;上次转载了有关DNS的基础介绍&#xff0c;此次我们来通过实验搭建DNS服务器从而更好的了解DNS搭建过程如何开始&#xff0c;且听我细细道来首先我们通常…

GDB中应该知道的几个调试方法

七、八年前写过一篇《用GDB调试程序》&#xff0c;于是&#xff0c;从那以后&#xff0c;很多朋友在MSN上以及给我发邮件询问我关于GDB的问题&#xff0c;一直到今天&#xff0c;还有人在问GDB的相关问题。这么多年来&#xff0c;有一些问题是大家反复在问的&#xff0c;一方面…

长沙java技术_长沙如何提高自身的Java技术

长沙如何提高自身的Java技术&#xff1f;Java自发行二十多年来&#xff0c;一直都是开发者的宠儿&#xff0c;在编程界的位置一直十分稳固。虽然Java人才需求量大&#xff0c;薪资水平高&#xff0c;但想要用Java语言胜任企业工作不容易。比如要成为一名Java架构师&#xff0c;…

strcpy与strcat函数原型

1.strcpy函数原型 char *my_strcpy(char *dest,const char *src) //const使在函数中不能修改*src其原先的值{   char *strDest dest; //保存原始的strDest   assert((dest!NULL)&&(src!NULL)); //检验参数&#xff0c;…

CCF 201312-4 有趣的数

试题编号&#xff1a;201312-4试题名称&#xff1a;有趣的数时间限制&#xff1a;1.0s内存限制&#xff1a;256.0MB问题描述&#xff1a; 问题描述我们把一个数称为有趣的&#xff0c;当且仅当&#xff1a;1. 它的数字只包含0, 1, 2, 3&#xff0c;且这四个数字都出现过至少一次…

java 代码重用_Java 代码重用:功能与上下文重用

我几乎不需要讨论为什么重用代码是有利的。代码重用通常使得程序开发更加快速&#xff0c;并使得 BUG 减少。一旦一段代码被封装和重用&#xff0c;那么只需要检查很少的一段代码即可确保程序的正确性。如果在整个应用程序中只需要在一个地方打开和关闭数据库连接&#xff0c;那…

GCC-3.4.6源代码学习笔记

大约4年前&#xff0c;我加入了GDNT - 北电网络在中国的合资企业&#xff0c;参与3G UMTS无线接入网的研发工作。与GCC有了第一次亲密的接触&#xff08;之前使用的是MS的VC&#xff09;。彼时&#xff0c;北电在其诸如&#xff0c;UMTS、CDMA、及自行开发的众多工具等项目中&a…

互联网

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/u/3127489/blog/1550726

GCC笔记 命令行分析

1984年&#xff0c;Richard Stallman发起了自由软件运动&#xff0c;GNU (Gnus Not Unix)项目应运而生&#xff0c;3年后&#xff0c;最初版的GCC横空出世&#xff0c;成为第一款可移植、可优化、支持ANSI C的开源C编译器。GCC最初的全名是GNU C Compiler,之后&#xff0c;随着…

java 反射用法_Java 反射的概念与使用

一&#xff0c;反射的概念对于一个人来说&#xff0c;了解自己的能力、本事、特点&#xff0c;对于他去干事创业来说&#xff0c;是很重要的。同样的&#xff0c;对于一门面向对象的语言来说&#xff0c;了解类(对象其实就是类的实现)本身也是重要的&#xff0c;可以在很多地方…

关于Unity中的Mesh Collider碰撞器

原来我的场景中有一个平面Plane带Mesh Collider碰撞器组件&#xff0c;一个主角Hero带有一个Box Collider碰撞器和有重力的Rigidbody刚体组件&#xff0c;主角可以放在平面上。 在导入场景后&#xff0c;隐藏平面Plane&#xff0c;给一个地板添加一个Mesh Collider碰撞器&#…