题目来源:NOI2018模拟测试赛(二十六)

题解:

首先由于这是个01串,所以反对称串的意思就是这个字符串的后半部分是前半部分的反转且翻转结果;

一个串出现有三种情况:在前半部分,在后半部分或穿过中间;

对于前两种情况,由于n很小,可以直接在AC自动机跑状压DP,对于第三种情况特殊处理一下,就是对于所有子串的所有前缀,判断以这个前缀为结尾能否构造出这个串,有则累加答案就好了,具体见代码。

代码:

 #include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
#define mod 998244353
using namespace std;
typedef long long ll;
typedef double db;
struct ac{
int fa,fail,son[],s,t;
}t[];
int n,m,nw,tmp,ans=,len,cnt=,num[],f[][][];
char s[];
void ins(char *s,int len,int id){
int nw=;
for(int i=;i<=len;i++){
if(!t[nw].son[s[i]-'']){
t[nw].son[s[i]-'']=++cnt;
num[cnt]=s[i]-'';
t[cnt].fa=nw;
}
nw=t[nw].son[s[i]-''];
}
t[nw].s|=(<<id-);
}
void AC(){
queue<int>q;
for(int i=;i<=;i++){
if(t[].son[i]){
q.push(t[].son[i]);
t[t[].son[i]].fail=;
}
}
while(!q.empty()){
int u=q.front();
q.pop();
t[u].s|=t[t[u].fail].s;
for(int i=;i<=;i++){
if(t[u].son[i]){
t[t[u].son[i]].fail=t[t[u].fail].son[i];
q.push(t[u].son[i]);
}else t[u].son[i]=t[t[u].fail].son[i];
}
}
}
int getfa(int u){
int ret=;
for(int nw=u;nw;nw=t[nw].fa){
u=t[u].son[num[nw]^];
ret|=t[u].s;
}
return ret;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%s",s+);
len=strlen(s+);
ins(s,len,i);
reverse(s+,s+len+);
for(int j=;j<=len;j++){
s[j]=((s[j]-'')^)+'';
}
ins(s,len,i);
}
AC();
f[][][]=;
for(int tt=;tt<=m;tt++){
nw^=;
memset(f[nw],,sizeof(f[nw]));
for(int i=;i<=cnt;i++){
for(int j=;j<(<<n);j++){
for(int k=;k<=;k++){
f[nw][t[i].son[k]][j|t[t[i].son[k]].s]=(f[nw][t[i].son[k]][j|t[t[i].son[k]].s]+f[nw^][i][j])%mod;
}
}
}
}
for(int i=;i<=cnt;i++){
tmp=getfa(i);
for(int j=;j<(<<n);j++){
if((tmp|j)==(<<n)-){
ans=(ans+f[nw][i][j])%mod;
}
}
}
printf("%d",ans);
return ;
}

最新文章

  1. Jsoup系列学习(2)-解析html文件
  2. Cocosd-x的坐标系
  3. 基于.NET的CAD二次开发学习笔记二:AutoCAD .NET中的对象
  4. Struts框架——(一)用Servlet + JSP演示Struts基本原理
  5. java类的定义以及参数传递
  6. 使用javascript判断浏览器对css3的支持情况【译】
  7. Call C# in powershell
  8. OpenVPN莫名其妙断线的问题及其解决-confirm
  9. oracle Form Builer:FIND_FORM Built-in
  10. Hibernate不同数据库 方言|驱动|url 配置
  11. Linux方向职业规划
  12. coder
  13. cf A. Jeff and Digits
  14. Linux红黑树(二)——访问节点
  15. [POJ2115]C Looooops 拓展欧几里得
  16. content+animation实现loading效果
  17. border-image属性把边框的背景设置为图片
  18. CentOS上部署.net core
  19. JavaScript 中禁止用户右键菜单,复制,选取,Ctrl,Alt,Shift. 获取宽高,清除浮动
  20. CF Round #509 (Div. 2)

热门文章

  1. git入坑随笔
  2. 洛谷P1055 ISBN号码
  3. [luogu4053 JSOI2007] 建筑抢修 (贪心 优先队列)
  4. omap 移植qt4.7.0
  5. Python 之 格式化文件
  6. RE:ゼロから始める文化課生活
  7. PatentTips - Uncore thermal management
  8. STL之效率比較
  9. Android应用之——微信微博第三方sdk登录分享使用过程中的一些常见问题
  10. SAM学习笔记