Tavas and Malekas
题面
题目描述
给你两个字符串a和b,告诉所有你b在a中一定匹配的位置,求有中不同的字符串a。a的长度为n,b的长度为m,一定匹配的位置有p个。若b在a中的一定匹配的位置为x,说明a[x…x+m-1]=b[1…m]。a和b中只有小写字母。
输入格式
第一行两个字符串n、p;(1<=n<=100000, 0<=p<=n-m+1)
第二行有一个字符串b;(1<=m<=n)
第三行有p个数:这p个一定匹配的位置。
输出格式
一个数:答案。模10^9+7。
样例
Input1
6 2
ioi
1 3
Output1
26
Input2
5 2
ioi
1 2
Output1
0
样例解释
第一个样例中a的前5个字符为”ioioi”,最后一个字符可以是任意的字符,所以答案为26.
第二个样例中a的第二个字符不可能既是i又是o。
题解
相邻出现的串假如没有重叠的化, 则空位直接统计;
假如出现重叠, 则用扩展KMP的\(match\)数组判断是否合法即可.
#include <cstdio>
#include <cstring>
#include <algorithm>
const int L = 1000000, MOD = (int)1e9 + 7;
int power(int a, int x)
{
int res = 1;
for(; x; x >>= 1, a = (long long)a * a %MOD)
if(x & 1)
res = (long long)res * a % MOD;
return res;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("Tavas.in", "r", stdin);
#endif
int n, P;
scanf("%d%d\n", &n, &P);
if(! P)
{
printf("%d\n", power(26, n));
return 0;
}
static char str[L];
scanf("%s", str);
static int mch[L];
int len = strlen(str);
mch[0] = len - 1;
int p = 1;
mch[p] = -1;
for(; mch[p] + p < len && str[p + mch[p] + 1] == str[mch[p] + 1]; ++ mch[p]);
int mx = mch[p];
for(int i = 2; i < len; ++ i)
{
mch[i] = std::max(0, std::min(mx - i, mch[i - p]));
for(; i + mch[i] < len && str[i + mch[i] + 1] == str[mch[i] + 1]; ++ mch[i]);
if(i + mch[i] > mx)
p = i, mx = i + mch[i];
}
static int pos[L];
for(int i = 0; i < P; ++ i)
scanf("%d", pos + i);
std::sort(pos, pos + P);
int ans = power(26, pos[0] - 1);
for(int i = 1; i < P; ++ i)
{
if(pos[i] - pos[i - 1] >= len)
ans = (long long) ans * power(26, pos[i] - pos[i - 1] - len) % MOD;
else if(pos[i] - pos[i - 1] < len)
if(mch[pos[i] - pos[i - 1]] ^ len - (pos[i] - pos[i - 1]) - 1)
ans *= 0;
}
if(n - pos[P - 1] < len)
ans *= 0;
printf("%d\n", (long long)ans * power(26, n - pos[P - 1] - len + 1) % MOD);
}
Tavas and Malekas的更多相关文章
- Codeforces 535D - Tavas and Malekas
535D - Tavas and Malekas 题目大意:给你一个模板串,给你一个 s 串的长度,告诉你 s 串中有 m 个模板串并告诉你,他们的其实位置, 问你这样的 s 串总数的多少,答案对1e ...
- 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 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个串覆盖上一个串上面,是可以得,不会超时. 要注意到一点,全部覆盖后再判断时候合法,和边放边判断, ...
- 【Codeforces Round #299 (Div. 2) D】Tavas and Malekas
[链接] 我是链接,点我呀:) [题意] 给你n个位置,然后让你从某些位置开始的|p|个位置,填上p这个字符串. 问你填的时候是否会发生冲突->输出0 否则输出最终n个位置组成的可能的字符串的总 ...
- [CF535D]Tavas and Malekas 题解
题意简述 有一个空着的长度为\(n\)的字符串\(ans\),再给出一个长度为\(m\)的序列\(a\),现要在序列中每个元素\(a_i\)的位置开始都规定必须为一个给定的字符串\(s\).问字符串\ ...
随机推荐
- Selenium2启动浏览器且加载插件
一.SELENIUM2启动浏览器 注意: SELENIUM2在启动浏览器时,都是启动一个干净的没有任务 插件及cookies信息的浏览器,即使是你之前的浏览器有设置过代理,到自动化启动时,也是没有代理 ...
- electron 安装
1.从网上下载的是nodejs的v0.10.42版本的安装文件,安装node-v0.10.42-x86.msi都使用默认安装,安装完成后会安装在C:\Program Files\nodejs\目录下, ...
- edge浏览器识别ip地址为手机号的解决办法
edge浏览器识别ip地址为手机号的解决办法 今天突然发现类似101.231.70.242的ip地址会在edge浏览器里面识别为可点击的链接,后来看了一下,原因就是被识别为手机号了,因为我发现点击的时 ...
- day03_11 if语句实现猜年龄01
老男孩猜年龄游戏 age_of_princal = 56 guess_age = int( input(">>:") ) #以下为伪代码 ''' if guess_ag ...
- 《Effective Java》笔记 :(一)创建和销毁对象
一 .考虑用静态工厂方法代替构造器 1. 静态工厂方法与设计模式中的工厂方法模式不同,注意不要混淆 例子: public static Boolean valueOf(boolean b){ retu ...
- Python 单例模式(3种方式)
方式一: # 单例模式: # 实现目的:实例化多次,得到的实例是同一个,就是同一个对象,同一个名称空间(更加节省空间) ####################################方式一: ...
- C语言总结(3)
1.字符输入函数getchar 输入一个字符 char ch; ch=getchai(); 字符输出函数putchar 输出一个字符 putchar(输出参数): 2.调用scanf和printf输入 ...
- 面向对象编程(二)封装--构造方法,this关键字,static关键字,方法重载
面向对象三大特点:封装.继承.多态 封装概念 ① 将东西包装在一起,然后以新的完整形式呈现出来: 将方法和字段一起包装到一个单元中,单元以类的形式实现; ② 信息隐藏,隐藏对象的实现细节,不让 ...
- hdu 5444 构建二叉树,搜索二叉树
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- HDU4548 美素数
Problem Description 小明对数的研究比较热爱,一谈到数,脑子里就涌现出好多数的问题,今天,小明想考考你对素数的认识. 问题是这样的:一个十进制数,如果是素数,而且它的各位数字和也是素 ...