[CF535D]Tavas and Malekas 题解
题意简述
有一个空着的长度为\(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 题解的更多相关文章
- 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 ...
- D. Tavas and Malekas 解析(字串匹配)
Codeforce 535 D. Tavas and Malekas 解析(字串匹配) 今天我們來看看CF535D 題目連結 題目 給你一個字串$p$和一些$index$代表字串$p$在哪些位置會和長 ...
- Codeforces 535D - Tavas and Malekas
535D - Tavas and Malekas 题目大意:给你一个模板串,给你一个 s 串的长度,告诉你 s 串中有 m 个模板串并告诉你,他们的其实位置, 问你这样的 s 串总数的多少,答案对1e ...
- Tavas and Malekas
题面 题目描述 给你两个字符串a和b,告诉所有你b在a中一定匹配的位置,求有中不同的字符串a.a的长度为n,b的长度为m,一定匹配的位置有p个.若b在a中的一定匹配的位置为x,说明a[x-x+m-1] ...
- 【Codeforces Round #299 (Div. 2) D】Tavas and Malekas
[链接] 我是链接,点我呀:) [题意] 给你n个位置,然后让你从某些位置开始的|p|个位置,填上p这个字符串. 问你填的时候是否会发生冲突->输出0 否则输出最终n个位置组成的可能的字符串的总 ...
- codeforces 535D. Tavas and Malekas KMP
题目链接 又复习了一遍kmp....之前都忘光了 #include<bits/stdc++.h> using namespace std; #define pb(x) push_back( ...
- CF #299 div1 B. Tavas and Malekas KMP-next数组
题目链接:http://codeforces.com/contest/536/problem/B 一个原始字符串,一个未知字符串,每一次从pos[i]开始覆盖未知字符串,问最后字符串的形式,以及判断过 ...
- Codeforces Round #299 (Div. 2)D. Tavas and Malekas
KMP,先预处理按每个节点标记,扫一遍更新每个匹配位置,最后kmp判断是否有重合而且不相同的地方 注意处理细节,很容易runtime error #include<map> #includ ...
- D. Tavas and Malekas DFS模拟 + kmp + hash || kmp + hash
http://codeforces.com/contest/535/problem/D 如果真的要把m个串覆盖上一个串上面,是可以得,不会超时. 要注意到一点,全部覆盖后再判断时候合法,和边放边判断, ...
随机推荐
- 用matplotlib对数据可视化
下图是要用到的数据集,反映了从1984到2016年的失业率的变化 1.导入可视化模块import matlibplot.pyplot as plt, 函数plt.plot(x, y)确定折线图的点,x ...
- 剑指offer--day12
1.1 题目:复杂链表的复制:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回 ...
- 应用安全 - CMS - ThinkCMF - 漏洞汇总
ThinkCMF X1.6.0-X2.2.3任意内容包含漏洞 Date: 2019.10 类型: 任意文件写入导致远程代码执行 影响范围: ThinkCMF X1.6.0 ThinkCMF X2.1. ...
- 解决Jackson2反序列化LocalDateTime报错
今天在整合redis和spring boot的时候,遇到了一个错误,记录一下. 报错如下: Could not read JSON: Cannot construct instance of `jav ...
- 【C语言--数据结构】线性表链式存储结构
直接贴代码 头文件 #ifndef __LINKLIST_H__ #define __LINKLIST_H__ typedef void LinkList; typedef struct _tag_L ...
- The kth great number
The kth great number Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. I ...
- Python 入门之 Python三大器 之 生成器
Python 入门之 Python三大器 之 生成器 1.生成器 (1)什么是生成器? 核心:生成器的本质就是一个迭代器 迭代器是Python自带的 生成器程序员自己写的一种迭代器 def func( ...
- 数塔 Medium
Summer is coming! It's time for Iahub and Iahubina to work out, as they both want to look hot at the ...
- vue项目1-pizza点餐系统7-路由之控制滚动行为
一.在home组件中设置具体信息,设计样式 <template> <div class="row"> <div id="home" ...
- gp指标信息
RSI: 相对强弱指数,RSI的原理简单来说是以数字计算的方法求出买卖双方的力量对比 强弱指标理论认为,任何市价的大涨或大跌,均在0-100之间变动,根据常态分配 认为RSI值多在30-70之间变动, ...