感觉Dasin去年的毒瘤题质量都挺好的,果然还是我太菜了。

以下假设划横线部分都相等,字符$c$代表一个小写字母。

分类讨论:

$#1$ 先考虑$n == m$的情况 :

  $#1.1 :$

      A:         ?

      B:         ?

    首先考虑两个问号的填法,A串中填的字符比B串中填的字符字典序小的方案有$(25 + 24 + 23 + ... + 1) = (1 + 25) * 25 / 2 = 325$种,如果这样子填,那么后面的问号可以随意填,后面问号随意填的方案数(假设后面A串+B串的问号数量有$k$个)有$26^{k}$,还有26中填法使A和B到这个问号为止字典序都相同的方案,那么我们考虑乘上后面合法的方案数。

  $#1.2 :$

      A:          ?

      B:          c

    有$c - 'a'$种方案使A串的字典序一定小于B串,有一种填法能使A串和B串到这个位置为止字典序相同,我们再次考虑乘上后面合法的方案数。

  $#1.3 :$

      A:          c

      B:          ?

    有$'z' - c$种方案能使A串的字典序一定小于B串,有一种填法能使A串和B串到这个位置为止字典序相同,操作同$#1.2$。

  $#1.4 :$

      A:           c1

      B:           c2

    单纯考虑到c1和c2不同的情况,如果$c1 < c2$ 那么后面填法随意,如果$c1 > c2$那么后面不用填了,因为一定不合法。

$#2$  考虑一下$m != n$ 的情况

  $#2.1$ $ n < m$  其实不用填了,因为我们知道到长度为n的时候A的字典序是严格等于B的,那么后面不管怎么填,A的字典序都不会小于B。

  $#2.2$ $n > m$  只可能在B的比A长的部分中出现问号,那么随便填就好了。

我们假设区间$[l, max(n, m)]$的答案为$solve(l)$,去分治就好了,特别的,当当前处理的串都没有字符$?$时,返回一个0

如果直接暴力算后面还有多少个问号的话,时间会是$O(n ^ {2})$级别的,不能承受,我们可以处理串A和串B的问号出现次数后缀和,然后再预处理26的幂,就可以$O(1)$计算。

我就是因为只预处理到$1e5$然后WA了三次

考虑到每一个位置都在一层递归中访问的一次,所以时间复杂度是$O(n)级别的$,但是……跑的慢a

Code:

#include <cstdio>
#include <cstring>
using namespace std; const int N = 1e5 + ;
const int P = ; int testCase, n, m, suma[N], sumb[N], p26[N << ];
char a[N], b[N]; inline int max(int x, int y) {
return x > y ? x : y;
} int solve(int l) {
for(int i = l; i <= max(n, m);i++) {
if(a[i] != '?' && b[i] != '?') {
// if(b[i] == 0) return 0;
// if(a[i] == 0) return p26[sumb[i]];
if(a[i] > b[i]) return ;
if(a[i] < b[i])
return p26[suma[i + ] + sumb[i + ]];
}
if(a[i] == '?' && b[i] == '?')
return ( * p26[suma[i + ] + sumb[i + ]]% P + * solve(i + ) % P) % P;
if(a[i] == '?' && b[i] != '?') {
if(b[i] != )
return ((b[i] - 'a') * p26[suma[i + ] + sumb[i + ]] % P + solve(i + )) % P;
else return ;
} if(a[i] != '?' && b[i] == '?') {
if(a[i] != )
return (('z' - a[i]) * p26[suma[i + ] + sumb[i + ]] % P + solve(i + )) % P;
else return p26[sumb[i]];
}
}
return ;
} int main() {
// freopen("Sample.txt", "r", stdin); for(int i = p26[] = ; i <= ; i++)
p26[i] = p26[i - ] * % P; for(scanf("%d", &testCase); testCase--; ) {
scanf("%d%d", &n, &m);
scanf("%s%s", a + , b + ); memset(suma, , sizeof(suma));
memset(sumb, , sizeof(sumb));
for(int i = n; i >= ; i--)
suma[i] = suma[i + ] + (a[i] == '?');
for(int i = m; i >= ; i--)
sumb[i] = sumb[i + ] + (b[i] == '?'); printf("%d\n", solve());
} return ;
}

我应该是只会写这种级别的数数了

WOJ 7 智商的更多相关文章

  1. tyvj1463 智商问题

    背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有小姊妹的智商小姊妹的智商都是非负整 ...

  2. Tyvj 题目1463 智商问题(分块)

    P1463 智商问题 时间: 1500ms / 空间: 131072KiB / Java类名: Main 背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他 ...

  3. WOJ -1204

    WOJ -1204 1 出现次数大于一半 那么就利用普通的堆栈的思想,如果删除两个不同的元素,原来的多数元素还是多数元素,所以采取按条件入栈的方法,如果和top元素相同则入栈,否则top--,此元素也 ...

  4. 【TYVJ】1463 - 智商问题(二分/分块)

    http://tyvj.cn/Problem_Show.aspx?id=1463 二分的话是水题啊.. 为了学分块还是来写这题吧.. 二分: #include <cstdio> #incl ...

  5. Tyvj P1463 智商问题 分块

    P1463 智商问题 时间: 1500ms / 空间: 131072KiB / Java类名: Main 背景 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! 描述 某个同学又有很多小姊妹了他 ...

  6. 【tyvj1463】智商问题 [分块][二分查找]

    Background 各种数据结构帝~各种小姊妹帝~各种一遍AC帝~ 来吧! Description 某个同学又有很多小姊妹了他喜欢聪明的小姊妹 所以经常用神奇的函数来估算小姊妹的智商他得出了自己所有 ...

  7. TYVJ 1463 智商问题 分块

    TYVJ 1463 智商问题 Time Limit: 1.5 Sec  Memory Limit: 512 MB 题目连接 http://www.tyvj.cn/p/1463 背景 各种数据结构帝~ ...

  8. 【伪暴力+智商剪枝】Codeforces Round #489 (Div. 2) D

    失踪人口突然回归……orz.题解还是有必要写的,虽然估计只有自己(?自己也不一定看得懂)看得懂. 题目链接:http://codeforces.com/contest/992/problem/D 题目 ...

  9. CDOJ 1277 智商杯考试 每周一题 div2 二分+数学

    智商杯考试 题目连接: http://acm.uestc.edu.cn/#/problem/show/1277 Description 你是一个挂科选手. 你现在正在考试,你很方. 你参加的考试叫做智 ...

随机推荐

  1. MPEG4、XVID、AVC有什么区别

    MPEG-4包含XviD和DivX,而AVC优于二者mpeg4 DVD用的多,101mpeg4有AVC格式(加强版MP4)AVC/H.264是一种最新且技术含量最高的视频编码格式,由MPEG-4标准进 ...

  2. dedecms列表页文章有图调用缩略图 无图留空或自定义图片的方法!

    默认情况下,织梦的文章列表页会调用出当前栏目下的文章列表,并且调用出每个文章的缩略图:如果文章本身就有图,会调用出一张小图,如果没有,则会显示默认的织梦图片.这种处理方式有时候比较影响美观,其实可以修 ...

  3. 康托展开与逆康托展开模板(O(n^2)/O(nlogn))

    O(n2)方法: namespace Cantor { ; int fac[N]; void init() { fac[]=; ; i<N; ++i)fac[i]=fac[i-]*i; } in ...

  4. HDU - 6191 Query on A Tree (可持久化字典树/字典树合并)

    题目链接 题意:有一棵树,树根为1,树上的每个结点都有一个数字x.给出Q组询问,每组询问有两个值u,x,代表询问以结点u为根的子树中的某一个数与x的最大异或值. 解法一:dfs序+可持久化字典树.看到 ...

  5. ASP.NET MVC 缓存Outputcache (局部动态)

    首先说一下需求: 比如我需要对网站首页做缓存,于是在首页对于的Action上贴上了Outputcache,接着问题就来了,首页上的有部分数据是不能做缓存的,比如个人信息,不然,每个人登陆都是看到第一个 ...

  6. 学习动态性能表(8)--v$lock&v$locked_object

    学习动态性能表 第八篇-(1)-V$LOCK  2007.5.31 这个视图列出Oracle 服务器当前拥有的锁以及未完成的锁或栓锁请求.如果你觉着session在等待等待事件队列那你应该检查本视图. ...

  7. 难道调用ThreadPool.QueueUserWorkItem()的时候,真是必须调用Thread.Sleep(N)吗?

    开门见山,下面的例子中通过调用ThreadPool.QueueUserWorkItem(WaitCallback callBack, object state)的方式实现异步调用: 1: class ...

  8. mysql之 double write 浅析

    http://blog.itpub.net/22664653/viewspace-1140915/ 介绍double write之前我们有必要了解partial page write 问题 :     ...

  9. Ext.tree.Panel

    initComponent : function() { var data = null;        Ext.Ajax.request({            url : 'xxx/xx',   ...

  10. 如何通过ISO安装win7程序

    从下载u启动工具到安装Ghost Win7系统教程 来源:http://www.uqidong.com时间:2013-08-12 09:17:38 怎样用u启动u盘启动盘安装ghost系统?u启动制作 ...