B. Tavas and Malekas
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Tavas is a strange creature. Usually "zzz" comes out of people's mouth while sleeping, but string s of length n comes out from Tavas' mouth instead.

Today Tavas fell asleep in Malekas' place. While he was sleeping, Malekas did a little process on s. Malekas has a favorite string p. He determined all positions x1 < x2 < ... < xk where p matches s. More formally, for each xi (1 ≤ i ≤ k) he condition sxisxi + 1... sxi + |p| - 1 = pis fullfilled.

Then Malekas wrote down one of subsequences of x1, x2, ... xk (possibly, he didn't write anything) on a piece of paper. Here a sequence b is a subsequence of sequence a if and only if we can turn a into b by removing some of its elements (maybe no one of them or all).

After Tavas woke up, Malekas told him everything. He couldn't remember string s, but he knew that both p and s only contains lowercase English letters and also he had the subsequence he had written on that piece of paper.

Tavas wonders, what is the number of possible values of s? He asked SaDDas, but he wasn't smart enough to solve this. So, Tavas asked you to calculate this number for him.

Answer can be very large, so Tavas wants you to print the answer modulo 109 + 7.

Input

The first line contains two integers n and m, the length of s and the length of the subsequence Malekas wrote down (1 ≤ n ≤ 106 and0 ≤ m ≤ n - |p| + 1).

The second line contains string p (1 ≤ |p| ≤ n).

The next line contains m space separated integers y1, y2, ..., ym, Malekas' subsequence (1 ≤ y1 < y2 < ... < ym ≤ n - |p| + 1).

Output

In a single line print the answer modulo 1000 000 007.

Examples
input
6 2
ioi
1 3
output
26
input
5 2
ioi
1 2
output
0
Note

In the first sample test all strings of form "ioioi?" where the question mark replaces arbitrary English letter satisfy.

Here |x| denotes the length of string x.

Please note that it's possible that there is no such string (answer is 0).

题意:给一长度为n的字符串,和字符子串b,以及子串出现的位置,问你原字符串有多少种可能性?

题解:第一个KMP,先用一个vis的数组标记子串第个字符出现的位置,用kmp,去验证子串是否出现了M次,少于的话就是0;验证的过程中再用以个vis1数组标记子串

出现过的位置(两个vis这样可以免去赋值很巧妙有没有,我学别人的http://www.cnblogs.com/widsom/p/7364861.html)最后求出没有被标记的个数ans,26^ans%mod就是答案。代码如下:

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#define ll long long
using namespace std;
const int maxn=1e6+;
const int mod=1e9+;
bool vis[maxn],vis1[maxn];
int b,f[maxn],n,m;
//char a[maxn];
string a;
int main()
{
ios::sync_with_stdio(false);
cin.tie();
cin>>n>>m;
cin>>a;
for(int i=;i<m;i++)
{
cin>>b;
vis[b-]=true;
}
//int len=strlen(a);
int len=a.size();
f[]=-;
// memset(f,-1,sizeof(f));
for(int i=;i<len;i++)
{
int j=f[i-];
while((a[i]!=a[j+])&&j>=)
{
j=f[j];
}
if(a[j+]==a[i])
f[i]=j+;
else
f[i]=-;
}
int i=,j=;
int tmp=;
int t=-;
while(i<n)
{
if(vis[i])t=i;
if(t!=-)
{
if(i-t<len)
{
vis1[i]=true;
if(a[i-t]==a[j])
{
j++;
i++;
if(j==len)
{
tmp++;
j=f[j-]+;
}
}
else
{
if(j==)
{
i++;
}
else
j=f[j-]+;
}
}
else
i++; }
else
{
i++;
} }
if(tmp<m)
{
cout<<<<endl;
}
else
{
tmp=;
ll ans=;
for(i=;i<n;i++)
{
if(!vis1[i])ans=(ans*)%mod;
}
cout<<ans<<endl;
}
return ;
}

学习kmp这篇博客不错博主用心了http://www.cnblogs.com/SYCstudio/p/7194315.html

http://codeforces.com/contest/536/problem/B的更多相关文章

  1. codeforces.com/contest/325/problem/B

    http://codeforces.com/contest/325/problem/B B. Stadium and Games time limit per test 1 second memory ...

  2. [E. Ehab's REAL Number Theory Problem](https://codeforces.com/contest/1325/problem/E) 数论+图论 求最小环

    E. Ehab's REAL Number Theory Problem 数论+图论 求最小环 题目大意: 给你一个n大小的数列,数列里的每一个元素满足以下要求: 数据范围是:\(1<=a_i& ...

  3. http://codeforces.com/contest/555/problem/B

    比赛时虽然贪了心,不过后面没想到怎么处理和set的排序方法忘了- -,其实是和优先队列的仿函数一样的... 比赛后用set pair过了... #include <bits/stdc++.h&g ...

  4. http://codeforces.com/contest/610/problem/D

    D. Vika and Segments time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  5. http://codeforces.com/contest/612/problem/D

    D. The Union of k-Segments time limit per test 4 seconds memory limit per test 256 megabytes input s ...

  6. http://codeforces.com/contest/535/problem/C

    C. Tavas and Karafs time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. http://codeforces.com/contest/838/problem/A

    A. Binary Blocks time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  8. http://codeforces.com/contest/402/problem/E

    E. Strictly Positive Matrix time limit per test 1 second memory limit per test 256 megabytes input s ...

  9. codeforces.com/contest/251/problem/C

    C. Number Transformation time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

随机推荐

  1. PHP第一天

     2017年7月10日是在汉企第一天接触PHP课程,感觉公司很正规,有各种管理和考核制度,管理比较严格.下午看了他们做的第一阶段的项目,感觉挺有意思的,个人感觉PHP不仅要学会,还要熟练作用,需要多加 ...

  2. MIPI DSI转LVDS芯片方案TC358775XBG

    型号:TC358775XBG功能:MIPI转LVDS通信方式:IIC/MIPI Command mode分辨率:1920*1080电源:3.3/1.8/1.2封装形式:BGA64深圳长期现货 ,提供技 ...

  3. POI操作Excel的API注意点总结

    本篇是关于POI.jar操作Excel的API注意事项 基数问题 说明:我使用的是POI 3.15版本的,在版本问题上建议大家,在版本稳定的基础上尽量使用高版本的 看过很多帖子在问一个问题:假设原来有 ...

  4. 多模字符串匹配算法之AC自动机—原理与实现

    简介: 本文是博主自身对AC自动机的原理的一些理解和看法,主要以举例的方式讲解,同时又配以相应的图片.代码实现部分也予以明确的注释,希望给大家不一样的感受.AC自动机主要用于多模式字符串的匹配,本质上 ...

  5. java对文件加锁

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt208 在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文 ...

  6. HTTP协议是无状态协议,怎么理解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp24 HTTP协议是无状态协议,怎么理解?  2010-02-23 09:4 ...

  7. js中防止全局变量被污染的方法

    (function ($){ var oDiv = $('div1');//获取id为'div1'的页面元素 })(function $(id){ return document.getElement ...

  8. MySQL在高版本需要指明是否进行SSL连接问题

    Java使用mysql-jdbc连接MySQL出现如下警告: Establishing SSL connection without server's identity verification is ...

  9. Java中equals和==之间的区别

    今天在写表达式求值的时候,发现了equals和==||!=和!equals()之间是不一样的. 我就从网上搜了搜关于这方面的知识,然后在下面做一个总结: Java中有两类数据类型: 基本数据类型(Pr ...

  10. Sqli-Labs学习总结一

    题目1-20 github地址 前言 以前对于SQL注入,就是先判断下能不能注入,可以的话先试着联合查询,不行的话再上SQLMap,去年寒假拿了一本<SQL注入攻击与防御>,拿回家,看了几 ...