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; ]={,,,,,,, ...
随机推荐
- vue自学入门-1(Windows下搭建vue环境)
本人是一个喜欢动手的程序员,先跑起来个HelloWorld,增加感性认识,这三篇入门文章,花了不到一个小时,从网上找资料,程序跑通后,整理出来的,有的新人可能去哪找资料,运行代码都不知道,分享出来,大 ...
- WebStrom设置默认浏览器
- TCP/IP详解 卷1 第十八章 TCP的建立与终止
第十八章 TCP的建立与终止 tcpdump Tcpdump可以将网络中传送的数据报完截获下来进行分析.它支持针对网络层.协议.主机.网络或端口的过滤,并提供and.or.not等逻辑语句来帮助你去掉 ...
- TCP 链接 存在大量 close_wait 等待
大量 close_wait 等待 调整linux下 /etc/sysctl.conf参数,里面设置参数: # net.ipv4.tcp_keepalive_time 然后执行 # sysctl -p
- Elaticsearch 集群
elasticsearch开源的搜索引擎: ElasticSearch 个基于Lucene的搜索服务器:可以使用多节点的备份:集群设置: (类似是个数据库型.有索引有什么的).(lucene apa ...
- 多文档界面QMdiArea
当使用多文档界面功能时,我们是将QMdiArea作为主窗口的中央部件,然后在这个中央部件中,我们可以同时打开很多个子窗口QMdiSubWindow 样式: import sys from PyQt5. ...
- mongodb系列~关于双活状态的mongodb集群
一简介:说说我们异地双活的集群 二 背景:需要建立异地双活的架构 三 构建 1 需要保证第二机房至少两个副本集DB,这样在第一机房挂掉后才能保证第二机房的可用性 2 集群状态下第二机房启用config ...
- oracle查询所有的表明
如果是用该用户登录使用以下语句: SELECT * FROM USER_TABLES; 如果是用其他用户: SELECT * FROM ALL_TABLES WHERE OWNER='USER_NAM ...
- nginx入门一
配置文件: server_name user root; worker_processes 2; error_log logs/error-test.log; #pid logs/nginx.pid; ...
- Potential Pythonic Pitfalls
Potential Pythonic Pitfalls Monday, 11 May 2015 Table of Contents Not Knowing the Python Version Obs ...