codeforces 535D. Tavas and Malekas KMP

题目链接

又复习了一遍kmp....之前都忘光了

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define pb(x) push_back(x)
 4 #define ll long long
 5 #define mk(x, y) make_pair(x, y)
 6 #define lson l, m, rt<<1
 7 #define mem(a) memset(a, 0, sizeof(a))
 8 #define rson m+1, r, rt<<1|1
 9 #define mem1(a) memset(a, -1, sizeof(a))
10 #define mem2(a) memset(a, 0x3f, sizeof(a))
11 #define rep(i, a, n) for(int i = a; i<n; i++)
12 #define ull unsigned long long
13 typedef pair<int, int> pll;
14 const double PI = acos(-1.0);
15 const double eps = 1e-8;
16 const int mod = 1e9+7;
17 const int inf = 1061109567;
18 const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} };
19 const int maxn = 1e6+5;
20 int next[maxn], a[maxn], vis[maxn], used[maxn];
21 char s[maxn];
22 void get_next() {
23     int len = strlen(s);
24     int i = 0, j = -1;
25     next[0] = -1;
26     while(i<len) {
27         if(j==-1 || s[i] == s[j]) {
28             i++, j++;
29             next[i] = j;
30         } else {
31             j = next[j];
32         }
33     }
34     int pos = next[len];
35     while(pos != -1) {
36         vis[pos] = 1;
37         pos = next[pos];
38     }
39     return ;
40 }
41 int main()
42 {
43     int n, m;
44     cin>>n>>m;
45     scanf("%s", s);
46     int len = strlen(s);
47     get_next();
48     for(int i = 1; i<=m; i++) {
49         scanf("%d", &a[i]);
50     }
51     sort(a+1, a+m+1);
52     int flag = 0;
53     for(int i = 1; i<=m; i++) {
54         if(i == 1 || a[i]-a[i-1]>len) {
55             for(int j = a[i]; j<len+a[i]; j++) {
56                 used[j] = 1;
57             }
58         } else {
59             if(vis[len+a[i-1]-a[i]]) {
60                 for(int j = a[i-1]+len; j<len+a[i]; j++) {
61                     used[j] = 1;
62                 }
63             } else {
64                 flag = 1;
65                 break;
66             }
67         }
68     }
69     if(flag) {
70         puts("0");
71         return 0;
72     }
73     ll ans = 1;
74     for(int i = 1; i<=n; i++) {
75         if(!used[i]) {
76             ans = (ans*26)%mod;
77         }
78     }
79     cout<<ans<<endl;
80     return 0;
81 }
时间: 2024-11-08 19:07:38

codeforces 535D. Tavas and Malekas KMP的相关文章

Codeforces 535D - Tavas and Malekas

535D - Tavas and Malekas 题目大意:给你一个模板串,给你一个 s 串的长度,告诉你 s 串中有 m 个模板串并告诉你,他们的其实位置, 问你这样的 s 串总数的多少,答案对1e9+7取模. 我感觉我英语是不是不行啊,我以为他的意思是他里面一共只有m个匹配串,想着没有其他的匹配串,感觉 好麻烦好麻烦好麻烦啊!!!!!! 思路:最暴力的思路,他给你一个匹配串的位置,你就在s串上更新,如果遇到没有已经被更新而且字符不同时 输出0,然后统计剩下的未知字符的个数x,答案就是 (26

Codeforces 536B Tavas and Malekas 求自身首尾的重叠位置 KMP

题目链接:点击打开链接 题意: 用小写字母构造n长的串S,m个要求 字符串P 下面m个位置.a1, a2···am(输入有序) 要使得字符串S的以ai 开头且后面是一个P串. 问构造的方法数 思路: 实际上,对于ai, ai+1 ,两个位置,如果这两个位置会相互影响(即 ai+1 - ai < len) 复制一个和P一样的串P' 把P放在ai位置,把P'放在ai+1位置,那么只需要判断一下 P的后半段是否和P'的前半段匹配即可. 也就是P'的哪些位置是和P的尾部相同的. KMP求出这些位置放到s

codeforces535D:Tavas and Malekas(KMP)

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 o

【Codeforces 536B】Tavas and Malekas

536B Tavas and Malekas 题意:给一个字符串,现在要把这个字符串在一个大空字符串中放多次,每一次的开头在\(p_i\)位置,然后现在问这个大字符串有多少种情况. 思路:首先如果两个字符串放置的位置有重叠,重叠部分必须相等. 那么就是一个前缀要等于一个后缀. 所以果断z function.这样的话写起来比kmp快... 然后就可以对于每两个连续出现判断这些重复部分的交叉状况,同时算上所有的非自由的字符,最后求出\(2^{自由字符数量}\)即可. 原文地址:https://www

Codeforces Round #299 (Div. 2)D. Tavas and Malekas

KMP,先预处理按每个节点标记,扫一遍更新每个匹配位置,最后kmp判断是否有重合而且不相同的地方 注意处理细节,很容易runtime error #include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #inclu

Codeforces 432D Prefixes and Suffixes(KMP+dp)

题目连接:Codeforces 432D Prefixes and Suffixes 题目大意:给出一个字符串,求全部既是前缀串又是后缀串的字符串出现了几次. 解题思路:依据性质能够依据KMP算法求出全部的前后缀串,然后利用dp求解,dp[i]表示从1到i这个子串出现过的次数.转移方程dp[jump[i]]+=dp[i].随意一个dp[i]的初始状态应该是1. #include <cstdio> #include <cstring> const int N = 1e5+5; int

Codeforces 432D Prefixes and Suffixes (KMP、后缀数组)

题目链接: https://codeforces.com/contest/432/problem/D 题解L 做法一: KMP 显然next树上\(n\)的所有祖先都是答案,出现次数为next树子树大小. 做法二: 后缀数组 按照height分组,二分查找即可. 代码 KMP: #include<cstdio> #include<cstdlib> #include<cstring> #include<vector> #include<utility&g

cf#299 Tavas and Malekas

传送门在这里 题意:给出一个字符串的一个子串,告诉你子串在某些位置和原串匹配,求一共有多少可能的原串 思路:其实就是要判断给出子串的所有前缀和后缀哪些是相等的. 首先kmp的next数组求的是所有前缀子串(a1  a1a2  a1a2a3...)中长度最大的前缀和后缀的长度, 设字符串长度为len,那么next[len]得到的是整个字符串中长度最长的相等的前缀和后缀,并且可知,所有起始位置小于next[len]的后缀都不可能存在相等的前缀了,那么下一步就是求起始位置在[next[len]+1,l

Codeforces 535C Tavas and Karafs

题目链接:CF - 535C Karafs is some kind of vegetable in shape of an 1 × h rectangle. Tavaspolis people love Karafs and they use Karafs in almost any kind of food. Tavas, himself, is crazy about Karafs. Each Karafs has a positive integer height. Tavas has