Codeforces 535D - Tavas and Malekas
题目大意:给你一个模板串,给你一个 s 串的长度,告诉你 s 串中有 m 个模板串并告诉你,他们的其实位置,
问你这样的 s 串总数的多少,答案对1e9+7取模。
我感觉我英语是不是不行啊,我以为他的意思是他里面一共只有m个匹配串,想着没有其他的匹配串,感觉
好麻烦好麻烦好麻烦啊!!!!!!
思路:最暴力的思路,他给你一个匹配串的位置,你就在s串上更新,如果遇到没有已经被更新而且字符不同时
输出0,然后统计剩下的未知字符的个数x,答案就是 (26^x)%mod。这样可能会超时,我今天学习了一波
KMP(看毛片)算法,这玩意真的有点难理解,以后多理解几遍。
我们可以在更新s串的时候只更新后面没有更新的,然后用kmp扫一遍,看m个匹配串是否都出现过就好了。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+;
const ll mod=1e9+;
char s[N],t[N];
int nx[N];
int len1,len2,n,m,w[N],c=;
void get_next()
{
int k=;
for(int i=;i<len2;i++)
{
while(k> && t[k]!=t[i]) k=nx[k-];
if(t[k]==t[i]) k++;
nx[i]=k;
}
}
void kmp()
{
int k=;
for(int i=;i<n;i++)
{
while(k> && t[k]!=s[i]) k=nx[k-];
if(t[k]==s[i]) k++;
if(k==len2)
{
if(binary_search(w,w+m,i-k+)) c++;
}
}
}
int main()
{
cin>>n>>m;
scanf("%s",t);
len2=strlen(t);
for(int i=;i<n;i++) s[i]='?';
s[n]='\0';
for(int i=;i<m;i++) scanf("%d",&w[i]),w[i]-=;
sort(w,w+m);
m=unique(w,w+m)-w;
int last=-;
for(int i=;i<m;i++)
{
if(w[i]+len2->last)
{
int start=w[i],dis=;
if(last+>w[i])
{
dis=last+-w[i];//dis为相对模板串开头的偏移位置。
start=last+;
}
for(int j=start;j<=w[i]+len2-;j++) s[j]=t[j-start+dis];
last=w[i]+len2-;
}
}
//puts(s);
get_next();
kmp();
if(c<m)
{
puts("");
return ;
}
ll res=;
for(int i=;i<n;i++)
{
if(s[i]=='?') res+=;
}
ll ans=;
for(int i=;i<=res;i++)
{
ans=(ans*(ll))%mod;
}
cout<<ans<<endl;
return ;
}
Codeforces 535D - Tavas and Malekas的更多相关文章
- codeforces 535D. Tavas and Malekas KMP
题目链接 又复习了一遍kmp....之前都忘光了 #include<bits/stdc++.h> using namespace std; #define pb(x) push_back( ...
- 535D Tavas and Malekas
题目大意 给你一个串和m个下标 问你一个长度为n的串每一个下标开始的后缀的前缀都包含给定的串的方案数 分析 对于给定的串求出z数组 对于两个串不重叠的情况就是中间都不包含的数随便填即可 对于重叠的情况 ...
- 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 Round #299 (Div. 2)D. Tavas and Malekas
KMP,先预处理按每个节点标记,扫一遍更新每个匹配位置,最后kmp判断是否有重合而且不相同的地方 注意处理细节,很容易runtime error #include<map> #includ ...
- 【Codeforces Round #299 (Div. 2) D】Tavas and Malekas
[链接] 我是链接,点我呀:) [题意] 给你n个位置,然后让你从某些位置开始的|p|个位置,填上p这个字符串. 问你填的时候是否会发生冲突->输出0 否则输出最终n个位置组成的可能的字符串的总 ...
- CF #299 div1 B. Tavas and Malekas KMP-next数组
题目链接:http://codeforces.com/contest/536/problem/B 一个原始字符串,一个未知字符串,每一次从pos[i]开始覆盖未知字符串,问最后字符串的形式,以及判断过 ...
- Codeforces 535C - Tavas and Karafs
535C - Tavas and Karafs 思路:对于满足条件的r,max(hl ,hl+1 ,hl+2 ,......,hr )<=t(也就是hr<=t)且∑hi<=t*m.所 ...
- Codeforces B - Tavas and SaDDas
535B - Tavas and SaDDas 方法一:打表大法. 代码1: #include<bits/stdc++.h> using namespace std; ]={,,,,,,, ...
随机推荐
- 打包pyinstaller
安装:pip3 install pyinstaller 了解几个常用命令 参数 用处 -F 将程序打包成一个文件 -w 去除黑框 -i 添加程序图标 我们将需要打包的test.py文件放到桌面上,之后 ...
- 定时器QTimer
import sys from PyQt5.QtCore import QTimer, Qt from PyQt5.QtWidgets import QApplication, QWidget, QP ...
- TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of 'Index'
这个问题说的很清楚,就是类型不对,需要转化类型,首先讲一下这个问题是在使用pandas的resample函数激发的,官方文档解释的较为清楚,如下: Convenience method for fre ...
- pycharm永久激活(转)
机器上安装的pycharm失效了,注册服务器也不管用了.网上找了一个比较满意的激活方法,推荐给大家: 第一步:下载jar包: 此jar包的目的就是让截获截止时间并骗过pycharm; 百度云下载地址 ...
- Linux 内核里的“智能指针”【转】
转自:http://blog.jobbole.com/88279/ 众所周知,C/C++语言本身并不支持垃圾回收机制,虽然语言本身具有极高的灵活性,但是当遇到大型的项目时,繁琐的内存管理往往让人痛苦异 ...
- [ VB ] OrElse, AndAlso [ C# ] ||, && 运算符
条件演算子も当然のように C# と VB では記述方法が異なる.比較すると下表のようになる. VB C#OrElse ||AndAlso &&a ...
- C++:__stdcall详解
原文地址:http://www.cnblogs.com/songfeixiang/p/3733661.html 对_stdcall 的理解(上)在C语言中,假设我们有这样的一个函数:int funct ...
- Android Studio安装apk失败
可能的情况 手机上已经安装了应用或者应用卸载不彻底 解决办法: adb uninstall yourpackagename 如果uninstall失败,可以考虑 clean一下Android Stud ...
- (常用)re模块
re模块(正则)#re:一些带有特殊含义的符号或者符号的组合#为什么要用re:一堆字符串中找到你所需要的内容,过滤规则是什么样,通过re模块功能来告诉计算机你的过滤规则#应用:在爬虫中最为常用:使用爬 ...
- 转载:2.2.4 配置项的单位《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19629.html 大部分模块遵循一些通用的规定,如指定空间大小时不用每次都定义到字节.指定时间时不用精确到毫秒. 当指定空间大小时, ...