http://www.lydsy.com/JudgeOnline/problem.php?id=3802

dp[i][0/1/2/3]  表示前i个字母,第1、2个字符串,第2、3个字符串的关系分别为 < < , = < , < = , = =

枚举前i-1个字母 构成的关系

再枚举3个字符串的字母 转移

时间复杂度为 O(N* 26^3)

优化转移:

转移都是dp[i-1][0/1/2/3]-->dp[i][0/1/2/3]

预处理出f[i][j][k][s:0~3][t:0~3] 表示前面字母构成的字符串的关系为s,3个字符串分别加上1个字母i、j、k后转移到关系t的方案数

转移的时候不枚举3个字符串的字母,枚举新的关系0~3

直接用f数组转移

#include<cstdio>
#include<cstring> using namespace std; #define N 1000002 const int mod=1e9+; char s1[N],s2[N],s3[N]; int f[][][][][];
int dp[N][];
//0:i<j<k 1:i=j<k 2:i<j=k 3:i=j=k void pre()
{
int li,ri,lj,rj,lk,rk;
int t;
for(int i=;i<=;++i)
for(int j=;j<=;++j)
for(int k=;k<=;++k)
{
if(i==) li=,ri=;
else li=ri=i;
if(j==) lj=,rj=;
else lj=rj=j;
if(k==) lk=,rk=;
else lk=rk=k;
for(int ci=li;ci<=ri;++ci)
for(int cj=lj;cj<=rj;++cj)
for(int ck=lk;ck<=rk;++ck)
for(int s=;s<=;++s)
{
if(!s) t=;
else if(s==)
{
if(ci==cj) t=;
else if(ci<cj) t=;
else t=-;
}
else if(s==)
{
if(cj==ck) t=;
else if(cj<ck) t=;
else t=-;
}
else
{
if(ci>cj || ci>ck || cj>ck) t=-;
else if(ci<cj && cj<ck) t=;
else if(ci==cj && cj<ck) t=;
else if(ci<cj && cj==ck) t=;
else t=;
}
if(t>=) f[i][j][k][s][t]++;
}
}
} int main()
{
pre();
int T;
scanf("%d",&T);
int l1,l2,l3,len;
int x,y,z;
while(T--)
{
scanf("%s",s1+);
scanf("%s",s2+);
scanf("%s",s3+);
l1=strlen(s1+);
len=l1;
l2=strlen(s2+);
if(l2>len) len=l2;
l3=strlen(s3+);
if(l3>len) len=l3;
while(l1!=len) s1[++l1]='a'-;
while(l2!=len) s2[++l2]='a'-;
while(l3!=len) s3[++l3]='a'-;
for(int i=;i<=len;++i)
for(int j=;j<=;++j)
dp[i][j]=;
dp[][]=;
for(int i=;i<=len;++i)
{
x=s1[i]-'a'+;
if(x<) x=;
y=s2[i]-'a'+;
if(y<) y=;
z=s3[i]-'a'+;
if(z<) z=;
for(int j=;j<=;++j)
if(dp[i-][j])
for(int k=;k<=;++k)
dp[i][k]=(dp[i][k]+(long long)dp[i-][j]*f[x][y][z][j][k]%mod)%mod;
}
printf("%d\n",dp[len][]);
}
}

3802: Vocabulary

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 185  Solved: 68
[Submit][Status][Discuss]

Description

给你三个字符串,这些字符串有些单词模糊不可认了,用"?"来代表。
现在你可以用任意英文小写字母来代表它们。要求是使得给定的三个字符串中
所有的"?"被你认定的字母代替后,各不相同且按字典序出现。问有多少种方式。
 

Input

先给出一个数字N,代表数据组数。
接下来3*N行,每行给出一个字符串。长度<=1000 000

Output

输出结果 Mod 10^9+9

Sample Input

3
?heoret?cal
c?mputer
?cience
jagiellonia
?niversity
kra?ow
?
b
c

Sample Output

42562
52
1

bzoj千题计划234:bzoj3802: Vocabulary的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. Java关键字 Finally执行与break, continue, return等关键字的关系

    长文短总结: 在程序没有在执行到finally之前异常退出的情况下,finally是一定执行的,即在finally之前的return语句将在finally执行之后执行. finally总是在控制转移语 ...

  2. 用opencv实现工控机的开机录像

    需要训练一个神经网络模型,可能需要用到很多视频数据,所以我想把手头的工控机设置为上电自启动,再借助opencv编译一个可执行文件,放在windows开机启动文件夹里,这样只要连接好摄像头和工控机以及电 ...

  3. 虚拟机virtualBox安装linux系统 xshell远程连接linux

    虚拟机virtualBox安装linux系统 xshell远程连接linux 虚拟机概念: 通过软件, 使用虚拟化技术虚拟出电脑的硬件环境, 充当真实的电脑使用. 常见的虚拟软件: virtualBo ...

  4. 小刘的机器学习---SVM

    前言: 这是一篇记录小刘学习机器学习过程的随笔. 正文: 支持向量机(SVM)是一组用于分类, 回归和异常值检测的监督学习方法. 在分类问题中,SVM就是要找到一个同时离各个类别尽可能远的决策边界即最 ...

  5. 微软职位内部推荐-Senior Dev Lead - SharePoint

    微软近期Open的职位: SharePoint is a multi-billion dollar enterprise business that has grown from an on-prem ...

  6. mysql学习(1)

    开始我们基础的mysql学习 第一部分:补充知识 1. 昨天讲到的mysql初始化密码为空,今天又get到一种新的方法 Mysql安装后需要做的 Mysql安装成功后,默认的root用户密码为空,你可 ...

  7. PAT甲题题解-1058. A+B in Hogwarts (20)-大水题

    无语,这种水题还出,浪费时间,但又不得不A... #include <iostream> #include <cstdio> #include <algorithm> ...

  8. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  9. 《Linux内核分析》第五周:分析system_call中断处理过程

    实验 分析system_call中断处理过程 使用gdb跟踪分析一个系统调用内核函数(您上周选择那一个系统调用),系统调用列表参见http://codelab.shiyanlou.com/xref/l ...

  10. 使用Jekyll在Github上搭建个人博客 - 环境搭建

    本地安装Jekyll 首先安装Ruby及gem Ruby的安装 Ruby官网进行下载 从RubyInstaller下载ruby [新手推荐] 我采用的是RubyInstaller,无脑简单 勾选时我配 ...