标签:hnu
| Problem description | 
| 
 Samuel W. E. R. Craft is an artist with a growing reputation. Unfortunately, the paintings he sells do not provide him enough money for his daily expenses plus the new supplies he needs. He had a brilliant idea yesterday when he ran out of blank canvas:
 "Why don’t I create a gigantic new painting, made of all the unsellable paintings I have, stitched together?". After a full day of work, his masterpiece was complete.  | 
| Input | 
| 
 
  | 
| Output | 
| 
 A single integer representing the number of possible locations where his painting might be.  | 
| Sample Input | 
4 4 10 10 oxxo xoox xoox oxxo xxxxxxoxxo oxxoooxoox xooxxxxoox xooxxxoxxo oxxoxxxxxx ooooxxxxxx xxxoxxoxxo oooxooxoox oooxooxoox xxxoxxoxxo  | 
| Sample Output | 
4  | 
| Problem Source | 
| 
 HNU Contest 
 题意: 给出两个图,问大图中包含几个小图 
 思路: 用数字保存是一种方法,本以为超类型肯定不行的,没有想到居然也能AC,不知道是数据水还是数据保存方面的一些玄机? 
 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <math.h>
#include <bitset>
#include <algorithm>
#include <climits>
using namespace std;
#define ls 2*i
#define rs 2*i+1
#define UP(i,x,y) for(i=x;i<=y;i++)
#define DOWN(i,x,y) for(i=x;i>=y;i--)
#define MEM(a,x) memset(a,x,sizeof(a))
#define W(a) while(a)
#define gcd(a,b) __gcd(a,b)
#define LL long long
#define ULL unsigned long long
#define N 2005
#define INF 0x3f3f3f3f
#define EXP 1e-8
#define rank rank1
const int mod = 1000000007;
int h1,h2,w1,w2,ans;
char s1[N][N],s2[N][N];
const ULL t1 = 7;
const ULL t2 = 11;
ULL sum,a[N][N],b[N][N];
void solve()//把大图用数字表示的同时找出与小图相等的位置
{
    int i,j,k;
    ULL x=1;
    for(i = 0; i<w1; i++) x*=t1;
    for(i = 0; i<h2; i++)
    {
        ULL s = 0;
        for(j = 0; j<w1; j++) s = s*t1+s2[i][j];
        a[i][w1-1] = s;
        for(j = w1; j<w2; j++)
            a[i][j] = a[i][j-1]*t1-s2[i][j-w1]*x+s2[i][j];
    }
    x = 1;
    for(i = 0; i<h1; i++) x*=t2;
    for(i = w1-1; i<w2; i++)
    {
        ULL s = 0;
        for(j = 0; j<h1; j++) s = s*t2+a[j][i];
        b[h1-1][i] = s;
        if(s==sum) ans++;
        for(j = h1; j<h2; j++)
        {
            b[j][i] = b[j-1][i]*t2-a[j-h1][i]*x+a[j][i];
            if(b[j][i]==sum) ans++;
        }
    }
}
int main()
{
    int i,j,k;
    while(~scanf("%d%d%d%d",&h1,&w1,&h2,&w2))
    {
        for(i = 0; i<h1; i++) scanf("%s",s1[i]);
        for(i = 0; i<h2; i++) scanf("%s",s2[i]);
        sum = 0;
        for(i = 0; i<h1; i++)//把小图用数字表示
        {
            ULL s = 0;
            for(j = 0; j<w1; j++)
            {
                s = s*t1+s1[i][j];
            }
            sum = sum*t2+s;
        }
        ans = 0;
        solve();
        printf("%d\n",ans);
    }
    return 0;
}
 | 
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:hnu
原文地址:http://blog.csdn.net/libin56842/article/details/47403759