CodeForces - 471D MUH and Cube Walls

CodeForces - 471D

记录差分,利用kmp对分别除去了第一个数的两个数组进行匹配

注意特判模式串长度为一的情况

 1 #include <cstdio>
 2 #include <cstring>
 3 using namespace std;
 4
 5 const int maxn = 2e5 + 10;
 6 int ans, n, m;
 7
 8 void find_substring(int pattern[], int text[]) {
 9     vector<int> next(n + 1, 0);
10     for (int i = 1; i < n; i++) {
11         int j = i;
12         while (j > 0) {
13             j = next[j];
14             if (pattern[j] == pattern[i]) {
15                 next[i + 1] = j + 1;
16                 break;
17             }
18         }
19     }
20     for (int i = 0, j = 0; i < m; i++) {
21         if (j < n && text[i] == pattern[j]) {
22             j++;
23         } else {
24             while (j > 0) {
25                 j = next[j];
26                 if (text[i] == pattern[j]) {
27                     j++;
28                     break;
29                 }
30             }
31         }
32         if (j == n) ans++;
33     }
34 }
35
36 int main(int argc, const char * argv[]) {
37     int text[maxn], pattern[maxn];
38     scanf("%d%d", &m, &n);
39     for (int i = 0; i < m; i++) scanf("%d", &text[i]);
40     for (int i = 0; i < n; i++) scanf("%d", &pattern[i]);
41     for (int i = m - 1; i >= 1; i--) text[i] = text[i] - text[i - 1];
42     for (int i = n - 1; i >= 1; i--) pattern[i] = pattern[i] - pattern[i - 1];
43     --n; --m;
44     find_substring(pattern + 1, text + 1);
45     if (n == 0) ans++;
46     printf("%d\n", ans);
47     return 0;
48 }
时间: 2024-10-12 12:33:56

CodeForces - 471D MUH and Cube Walls的相关文章

【CodeForces】471D MUH and Cube Walls KMP或者字符串HASH

想到两点就行: 1.相邻项相减,处理出相对高度,这样如果pattern或者text增加的话,就没问题了 2.KMP匹配O(n) HASH的话 ,我WA在第25组数据了,听说如果改为大素数取模就能AC KMP AC了 但是好奇怪我的KMP模板难道有问题?? 先贴KMP ac 代码 //#pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <cstring>

Codeforces Round #269 (Div. 2) D. MUH and Cube Walls KMP

D. MUH and Cube Walls Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant Horace from the zoo of Kiev got hold of lots of wooden cubes somewhere. They started making cube towers by placing the cubes one on top of the other. T

D - MUH and Cube Walls

D. MUH and Cube Walls Polar bears Menshykov and Uslada from the zoo of St. Petersburg and elephant Horace from the zoo of Kiev got hold of lots of wooden cubes somewhere. They started making cube towers by placing the cubes one on top of the other. T

codeforces MUH and Cube Walls

题意:给定两个序列a ,b, 如果在a中存在一段连续的序列使得 a[i]-b[0]==k, a[i+1]-b[1]==k.... a[i+n-1]-b[n-1]==k 就说b串在a串中出现过!最后输出b串在a串中出现几次! 思路: KMP变形!如何转换成KMP求解呢? 举一个例子说明一下: a: 5 10 8 10 11 9 11 12 10 15 b: 4 2 4 5 3 根据题意 a中的 10 8 10 11 9 与 b是匹配的, 11 9 11 12 10跟b也是匹配的! 如何将b串以及

#269(div2) D. MUH and Cube Walls

题意:2个序列A,B,B可以自身全部加减某个数字,问B和A匹配的个数 思路:不管怎样,B序列中相邻2个数之间的差是不变的,然后KMP. 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=200005; 4 5 int aa[N],a[N]; 6 int bb[N],b[N]; 7 int n,m; 8 int Next[N]; 9 10 void getnext() 11 { 12 int j, k; 13 j = 0

// codeforces 471D // kmp初学

// codeforces 471D // #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<iostream> #include<algorithm> using namespace std; int n,w; int a[200005],b[200005]; int da[200005],db[200005]; int nex

codeforces 525 D Arthur and Walls

题意: 给出一个n*m的表格,里面有'*'和'.',求把最少的'*'移除掉,使得'.'所在的连通块是矩形. 限制: 1 <= n,m <= 2000 思路: 2*2地考虑,如果2*2的格子里只有一个'*',说明这个'*'要去掉,其他情况都不用去掉.然后去掉这个'*'后,又会对其他四个格子有影响. 复杂度好难估计. /*codeforces 525 D Arthur and Walls 题意: 给出一个n*m的表格,里面有'*'和'.',求把最少的'*'移除掉,使得'.'所在的连通块是矩形. 限

CodeForces 525D D. Arthur and Walls(BFS)

题目链接:http://codeforces.com/problemset/problem/525/D 题意:n*m的格子,'*'代表墙壁,'.'代表房间,要求房间都必须是矩形,输出改动后的 n*m: 思路:看了官方题解,思路蛮巧妙的.因为要求一定是矩形,所有在每个2*2的格子里,若有3个'.'和1个'*',那么就将'*'改成'.',这样就能确保房间一定是矩形了. 代码如下: #include<cstdio> #include<cstring> #include<iostre

CodeForces 471C MUH and House of Cards

看题目的Hint 图形就知道题意了,对着图形,稍微观察一下就会发现,每一层需要的卡牌数目为 2 * n + (n - 1)个,然后大致就有个思路,暴力枚举,但是仅仅这样没法子枚举,这个公式 只代表其中一层,不可能对每一层都枚举吧,可以化简一下  公式就是 3 * n - 1,这样就会发现 每次差1就是3的倍数了,然后每一层都差1,如果有i层的话,那么其实就是差了i,这样就很容易想到了,假设共有卡牌 x张,其实 就是枚举 i  ,有多少个i 使得  (x + i)%3 == 0,这样就简单了,但是