Constellations
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 5044   Accepted: 983

Description

The starry sky in the summer night is one of the most beautiful things on this planet. People imagine that some groups of stars in the sky form so-called constellations. Formally a constellation is a group of stars that are connected together to form a figure
or picture. Some well-known constellations contain striking and familiar patterns of bright stars. Examples are Orion (containing a figure of a hunter), Leo (containing bright stars outlining the form of a lion), Scorpius (a scorpion), and Crux (a cross).

In this problem, you are to find occurrences of given constellations in a starry sky. For the sake of simplicity, the starry sky is given as a N × M matrix, each cell of which is a '*' or '0' indicating a star in the corresponding position
or no star, respectively. Several constellations are given as a group of T P × Q matrices. You are to report how many constellations appear in the starry sky.

Note that a constellation appears in the sky if and only the corresponding P × Q matrix exactly matches some P × Q sub-matrix in the N × M matrix.

Input

The input consists of multiple test cases. Each test case starts with a line containing five integers N, M, T, P and Q(1 ≤ N, M ≤ 1000, 1 ≤ T ≤ 100, 1 ≤ P, Q ≤ 50). 

The following N lines describe the N × M matrix, each of which contains M characters '*' or '0'.

The last part of the test case describe T constellations, each of which takes P lines in the same format as the matrix describing the sky. There is a blank line preceding each constellation.

The last test case is followed by a line containing five zeros.

Output

For each test case, print a line containing the test case number( beginning with 1) followed by the number of constellations appearing in the sky.

Sample Input

3 3 2 2 2
*00
0**
*00 **
00 *0
**
3 3 2 2 2
*00
0**
*00 **
00 *0
0*
0 0 0 0 0

Sample Output

Case 1: 1
Case 2: 2

题意:给定一个n行m列的01矩阵。再给定t个p行q列的小01矩阵,求这t个小矩阵有多少个在大矩阵中。

题解:这题我用的是KMP,先把矩阵二进制压缩成整型数组,再求整型数组的next数组,再去跟压缩后的大矩阵匹配。遗憾的是TLE了。

这题先就这样放着,等以后学了AC自己主动机再试试。

#include <stdio.h>
#define maxn 1002
#define maxm 52 char bigMap[maxn][maxn], smallMap[maxm][maxm];
__int64 smallToInt[maxm], hash[maxn][maxn];
int m, n, t, p, q, next[maxm]; void toInt64(int i, int j)
{
__int64 sum = 0;
for(int k = 0; k < p; ++k)
if(bigMap[i + k][j] == '*') sum = sum << 1 | 1;
else sum <<= 1;
hash[i][j] = sum;
} void charToHash()
{
int i, j, temp = n - p;
for(i = 0; i <= temp; ++i){
for(j = 0; j < m; ++j) toInt64(i, j);
}
} void getNext()
{
__int64 sum;
int i, j;
for(i = 0; i < q; ++i){
for(sum = j = 0; j < p; ++j)
if(smallMap[j][i] == '*') sum = sum << 1 | 1;
else sum <<= 1;
smallToInt[i] = sum;
}
i = 0; j = -1;
next[0] = -1;
while(i < q){
if(j == -1 || smallToInt[i] == smallToInt[j]){
++i; ++j;
if(smallToInt[i] == smallToInt[j]) next[i] = next[j];
else next[i] = j; //mode 2
}else j = next[j];
}
} bool KMP()
{
getNext();
int i, j, k, temp = n - p;
for(k = 0; k <= temp; ++k){
i = j = 0;
while(i < m && j < q){
if(j == -1 || hash[k][i] == smallToInt[j]){
++i; ++j;
}else j = next[j];
}
if(j == q) return true;
}
return false;
} int main()
{
// freopen("stdin.txt", "r", stdin);
int i, j, ans, cas = 1;
while(scanf("%d%d%d%d%d", &n, &m, &t, &p, &q) != EOF){
if(m + n + t + p + q == 0) break;
for(i = 0; i < n; ++i)
scanf("%s", bigMap[i]);
charToHash(); ans = 0;
while(t--){
for(i = 0; i < p; ++i)
scanf("%s", smallMap[i]);
if(KMP()) ++ans;
}
printf("Case %d: %d\n", cas++, ans);
}
return 0;
}

POJ3690 Constellations 【KMP】的更多相关文章

  1. 【KMP】【最小表示法】NCPC 2014 H clock pictures

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...

  2. 【动态规划】【KMP】HDU 5763 Another Meaning

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5763 题目大意: T组数据,给两个字符串s1,s2(len<=100000),s2可以被解读成 ...

  3. HDOJ 2203 亲和串 【KMP】

    HDOJ 2203 亲和串 [KMP] Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...

  4. 【KMP】Censoring

    [KMP]Censoring 题目描述 Farmer John has purchased a subscription to Good Hooveskeeping magazine for his ...

  5. 【KMP】OKR-Periods of Words

    [KMP]OKR-Periods of Words 题目描述 串是有限个小写字符的序列,特别的,一个空序列也可以是一个串.一个串P是串A的前缀,当且仅当存在串B,使得A=PB.如果P≠A并且P不是一个 ...

  6. 【KMP】Radio Transmission

    问题 L: [KMP]Radio Transmission 题目描述 给你一个字符串,它是由某个字符串不断自我连接形成的.但是这个字符串是不确定的,现在只想知道它的最短长度是多少. 输入 第一行给出字 ...

  7. 【kmp】似乎在梦中见过的样子

    参考博客: BZOJ 3620: 似乎在梦中见过的样子 [KMP]似乎在梦中见过的样子 题目描述 「Madoka,不要相信QB!」伴随着Homura的失望地喊叫,Madoka与QB签订了契约. 这是M ...

  8. 【POJ2752】【KMP】Seek the Name, Seek the Fame

    Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...

  9. 【POJ2406】【KMP】Power Strings

    Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...

随机推荐

  1. java.io.FileNotFoundException: /home/hadoop/hadoop/dfs/namenode/current/VERSION (Permission denied)

    今天布置hadoop集群,尝试单独将secondarynamenode分属到一台独立的虚拟机上, 当格式化后,start-dfs.sh.namenode没启动.查看日志.报错例如以下 查看权限才发现, ...

  2. CoreGraphics QuartzCore CGContextTranslateCTM 说明

    CoreGraphics.h 一些经常使用旋转常量 #define M_E 2.71828182845904523536028747135266250 e 
#define M_LOG2E 1.442 ...

  3. 警报C++精密整数除法计算损失

    非常偶然发现了一个精度损失的问题,简单来说: 有表达式: l = i/30 + j/40 + k/25, 求当{i,j,k} = {50,85,27}时l的值,非常easy,用计算器立即能够算出答案为 ...

  4. UVA11294-Wedding(2-SAT)

    option=com_onlinejudge&Itemid=8&page=show_problem&problem=2269">题目链接 题意:有n对夫妻參加一 ...

  5. 读书时间《JavaScript高级程序设计》三:函数,闭包,作用域

    上一次看了第6章,面向对象.这里接着看第7章. 第7章:函数表达式 定义函数有两种方式:函数声明.函数表达式 //函数声明 function functionName(arg0,arg1,arg2){ ...

  6. java.io.NotSerializableException

    结果发现序列不成功非静态内部类时的序列中,出现以下异常: java.io.NotSerializableException: com.tang.sharedpreferencesdemo.MainAc ...

  7. [Unity3d]定义自己的鼠标

    [Unity3d]自己定义鼠标 我们在用unity3d开发自己的游戏的时候.自己定义游戏中的鼠标也是常常要用到的.那我就得学学.事实上原理非常easy,先将鼠标给隐藏,然后在鼠标的位置上画出一个自己定 ...

  8. UVA - 10714 Ants

    最多时间就是每仅仅蚂蚁选择最久的爬行方式 最少时间就是每仅仅蚂蚁选择最快地爬行方式 #include<iostream> #include<map> #include<s ...

  9. Android于JNI调用列出的程序

    1.安装和下载cygwin,下载Android NDK: 2.于ndk工程JNI接口设计: 3.采用C/C++实现本地方法. 4.JNI生成动态链接库.so档: 5.动态链接库副本javaprojec ...

  10. WinJS Clipboard

    //剪贴板 方法1 window.uexClipboard = { copy: null, getContent: null, cbGetContent: null }; uexClipboard.c ...