Poj3690 constellations [KMP]

Source: Internet
Author: User

Constellations
Time limit:3000 Ms   Memory limit:65536 K
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 asN×MMatrix, 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 groupT p×QMatrices. You are to report how many constellations appear in the starry sky.

Note that a constellation appears in the sky if and only the correspondingP×QMatrix exactly matches someP×QSub-matrix inN×MMatrix.

Input

The input consists of multiple test cases. Each test case starts with a line containing five IntegersN,M,T,PAndQ(1 ≤N,M≤ 1000, 1 ≤T≤ 100, 1 ≤P,Q≤ 50 ).
The followingNLines describeN×MMatrix, each of which containsMCharacters '*' or '0 '.
The last part of the test case describeTConstellations, each of which takesPLines 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*000***00**00*0**3 3 2 2 2*000***00**00*00*0 0 0 0 0

Sample output

Case 1: 1Case 2: 2
Question: Given A 01 matrix of N rows and M columns, and then given a small 01 matrix of t p row Q columns, find out how many of the T small matrices are in the large matrix. Question: KMP is used to compress the binary matrix into an integer array, then calculate the next array of the integer array, and then match the compressed large matrix. Sorry, it's TLE .. This question should be put in this way first, and try again after learning the AC automatic machine.

#include <stdio.h>#define maxn 1002#define maxm 52char 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]

Contact Us

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.