题意简述

有一个空着的长度为\(n\)的字符串\(ans\),再给出一个长度为\(m\)的序列\(a\),现要在序列中每个元素\(a_i\)的位置开始都规定必须为一个给定的字符串\(s\)。问字符串\(ans\)的可能种类。

解法

主要考虑有可能\(a_i\)之间互相冲突导致直接输出\(0\),于是我们需要快速判断当前字符串\(s\)的首与尾是否匹配。显然有两种可行解法,第一种是KMP,第二种是玄学的字符串哈希。但是写这篇题解的蒟蒻不想打KMP,于是就写了一个哈希。

这里的哈希其实只用单哈希即可,模数我一开始取成\(99844353\),目测不是个质数,但是竟然过了QAQ,然后换成\(998244353\)(丝毫不怕被卡的样子),结果果断被卡(WA on test 31),于是果断使用了\(19260817\),就A掉了。

再讲一下字符串哈希结束之后的判断答案的种类数的做法,我们直接统计满足\(a_{i+1}-a_{i}>len\)的\(a_{i+1}-a_{i}-len\)的个数之和即可,注意首尾的特殊处理。

然后我们设刚才统计的个数为\(cnt\)个,那么答案就是\(26^{cnt}\),连快速幂都不用打,直接暴力乘即可,最后注意取模

代码

\(ch\)数组是上文中的字符串\(s\)

\(p\)是本题规定的模数

\(MOD\)是哈希的模数,\(BASE\)是哈希的基数

\(getVal\)函数用于取出\([l,r]\)的哈希值

#include <cstdio>
#include <cstring>
#define p 1000000007 int read(){
int x = 0; int zf = 1; char ch = ' ';
while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') zf = -1, ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;
} char ch[1000005];
long long res[1000005];
long long fac[1000005];
const long long MOD = 9982442353ll;
const long long prime = 431ll;
const long long BASE = 131ll; void getHash(int n){
res[0] = 1; fac[0] = 1;
for (int i = 1; i <= n; ++i)
fac[i] = (fac[i - 1] * BASE) % MOD;
for (int i = 1; i <= n; ++i)
res[i] = (res[i - 1] * BASE + (ch[i] - 'A') * prime) % MOD;
} inline long long getVal(int l, int r){
return ((res[r] - ((res[l - 1] * fac[r - l + 1]) % MOD) + MOD) % MOD);
} int a[1000005]; int main(){
int n = read(), m = read();
scanf("%s", ch + 1);
int len = strlen(ch + 1);
if (!m){
long long ans = 1;
for (int i = 1; i <= n; ++i)
(ans *= 26) %= p;
printf("%lld", ans);
return 0;
}
getHash(len);
for (int i = 1; i <= m; ++i){
a[i] = read();
if (a[i] + len - 1 > n){
puts("0");
return 0;
}
if (i > 1 && a[i - 1] + len > a[i]){
int x = a[i - 1] + len - a[i];
if (getVal(len - x + 1, len) != getVal(1, x)){
puts("0");
return 0;
}
}
}
int cnt = a[1] - 1;
for(int i = 1; i < m; i++){
if(a[i] + len < a[i + 1]){
cnt += a[i + 1] - a[i] - len;
}
}
cnt += n - a[m] - len + 1;
long long ans = 1;
for (int i = 1; i <= cnt; ++i)
(ans *= 26) %= p;
printf("%lld", ans);
return 0;
}

[CF535D]Tavas and Malekas 题解的更多相关文章

  1. Codeforces Round #299 (Div. 2) D. Tavas and Malekas kmp

    题目链接: http://codeforces.com/problemset/problem/535/D D. Tavas and Malekas time limit per test2 secon ...

  2. D. Tavas and Malekas 解析(字串匹配)

    Codeforce 535 D. Tavas and Malekas 解析(字串匹配) 今天我們來看看CF535D 題目連結 題目 給你一個字串$p$和一些$index$代表字串$p$在哪些位置會和長 ...

  3. Codeforces 535D - Tavas and Malekas

    535D - Tavas and Malekas 题目大意:给你一个模板串,给你一个 s 串的长度,告诉你 s 串中有 m 个模板串并告诉你,他们的其实位置, 问你这样的 s 串总数的多少,答案对1e ...

  4. Tavas and Malekas

    题面 题目描述 给你两个字符串a和b,告诉所有你b在a中一定匹配的位置,求有中不同的字符串a.a的长度为n,b的长度为m,一定匹配的位置有p个.若b在a中的一定匹配的位置为x,说明a[x-x+m-1] ...

  5. 【Codeforces Round #299 (Div. 2) D】Tavas and Malekas

    [链接] 我是链接,点我呀:) [题意] 给你n个位置,然后让你从某些位置开始的|p|个位置,填上p这个字符串. 问你填的时候是否会发生冲突->输出0 否则输出最终n个位置组成的可能的字符串的总 ...

  6. codeforces 535D. Tavas and Malekas KMP

    题目链接 又复习了一遍kmp....之前都忘光了 #include<bits/stdc++.h> using namespace std; #define pb(x) push_back( ...

  7. CF #299 div1 B. Tavas and Malekas KMP-next数组

    题目链接:http://codeforces.com/contest/536/problem/B 一个原始字符串,一个未知字符串,每一次从pos[i]开始覆盖未知字符串,问最后字符串的形式,以及判断过 ...

  8. Codeforces Round #299 (Div. 2)D. Tavas and Malekas

    KMP,先预处理按每个节点标记,扫一遍更新每个匹配位置,最后kmp判断是否有重合而且不相同的地方 注意处理细节,很容易runtime error #include<map> #includ ...

  9. D. Tavas and Malekas DFS模拟 + kmp + hash || kmp + hash

    http://codeforces.com/contest/535/problem/D 如果真的要把m个串覆盖上一个串上面,是可以得,不会超时. 要注意到一点,全部覆盖后再判断时候合法,和边放边判断, ...

随机推荐

  1. QA的工作职责是什么?

    目前不知道,后续一点一点查资料补充吧 QA不管做什么的类型的测试,最基础的功能测试,需要搭建测试环境:进阶部分的性能压力测试,对搭建环境的要求更高:接口功能测试,搭建测试环境,和功能测试的差不多: 测 ...

  2. swagger 访问格式

    boot工程格式如下 http://10.166.10.169:8085/swagger-ui.html 非boot工程加个自己项目名 http://10.166.10.169:8085/xxx/sw ...

  3. 2019JAVA第一次课程总结

    课程总结:到现在为止之,学习专业课程已有两周了,从刚开始的啥也不懂,现在慢慢入门了.最开始我们为JAVA开发了运行环境,然后使用类编写了最简单的输出,然后开始学习了数据类型,这可以在编程中帮我们解决一 ...

  4. layui动态渲染select等组件并初始化赋值失败

    描诉:有一个用户信息form表单,其中有部门单选框,数据库中有一张dept(部门)表,要动态渲染出所有部门,并默认选中用户所在部门 关键代码: html页面 <div class="l ...

  5. CAS单点登录系统入门--分布式登录验证

    1.开源单点登录系统CAS入门 1.1 什么是单点登录 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要 ...

  6. RabbitMq学习2-php命令行模式测试rabbitmq

    一.RabbitMQ结构 1.几个概念说明:       Broker:简单来说就是消息队列服务器实体. Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列. Queue:消息队列载体 ...

  7. tensorflow学习笔记二----------变量

    tensorflow里面的变量表示,需要使用特定的语法进行.如果想构造一个行(列)向量,需要调用Variable函数进行.对两个变量进行操作,也要调用相应的函数. import tensorflow ...

  8. NOI-LINUX

    先把配置背过吧: (set-background-color "gray15")(set-foreground-color "gray")(global-lin ...

  9. 通过编写串口助手工具学习MFC过程——(三)Unicode字符集的宽字符和多字节字符转换

    通过编写串口助手工具学习MFC过程 因为以前也做过几次MFC的编程,每次都是项目完成时,MFC基本操作清楚了,但是过好长时间不再接触MFC的项目,再次做MFC的项目时,又要从头开始熟悉.这次通过做一个 ...

  10. php配置伪静态如何将.htaccess文件转换 nginx伪静态文件

    php通常设置伪静态三种情况,.htaccess文件,nginx伪静态文件,Web.Config文件得形式,如何将三种伪静态应用到项目中呢, 1,.htaccess文件 实例 <IfModule ...