C. Fractal detectortime limit per test
4 seconds
Memory limit per test
256 megabytes
Input
Standard Input
Output
Standard output
Little Vasya likes painting fractals very much.
He does it like this. first the boy cuts out a 2 rows × every 2-cell square out of squared paper. then he paints some cells black. the boy callthe cut out square a fractal pattern.
Then he takes a clean square sheet of paper and paints a fractal by the following algorithm:
- He divides the sheet into four identical squares. A part of them is painted black according to the fractal pattern.
- Each square that remained white, is split into 4 Lesser White Squares, some of them are painted according to the fractal pattern. Each square that remained black, is split into 4 lesser black squares.
In each of the following steps Step 2 repeats. to draw a fractal, the boy can make an arbitrary positive number of steps of the algorithm. but he need to make at least two steps. in other words step 2 of the algorithm must
Be done at least once. The resulting picture (the square with painted cells) will be a fractal. The figure below shows drawing a fractal (here boy made three steps of the algorithm ).
One evening Vasya got very tired, so he didn't paint the fractal, he just took a sheet of paper, paintedNLimit × limitM-Cell field. Then Vasya paint some
Cells black.
Now he wonders, how many squares are on the field, such that there is a fractal, which can be obtained as described above, and which is equal to that square. square is considered equal to some fractal if they consist of the same amount of elementary not divided
Cells and for each elementary cell of the square corresponding elementary cell of the fractal have the same color.
Input
The first line contains two space-separated IntegersN, Bytes,M(2 cores ≤ CoresN, Bytes,MLimit ≤ limit 500 )-
The number of rows and columns of the field, correspondingly.
NextNLines containMCharacters each-the description
Of the field, painted by Vasya. Character "." represents a white cell, character "*"
Represents a black cell.
It is guaranteed that the field description doesn't contain other characters than "." and "*".
Output
On a single line print a single integer-the number of squares on the field, such that these squares contain a drawn fractal, which can be obtained as described above.
Sample test (s) Input
6 11......*.****.*.*....**.***....*.*..***.*.....*.*.....**......*.*..
Output
Input
Output
Note
The answer for the first sample is shown on the picture below. fractals are outlined by red, blue and green squares.
The answer for the second sample is 0. There is no fractal, equal to the given picture.
Title: http://codeforces.com/contest/228/problem/C
Question: Is my understanding weak ?? The question is to describe a classification, divide a square into 4 points, and then apply several of them to the black color, and then continue to perform the same steps, each coloring scheme is the same as the first time, if it's all black, you don't need to paint it ....
Analysis: I am not very familiar with this type. I can't see it all at once as status compression DP, but I guess it is DP, assume that f [I] [J] [T] [mask] indicates the classification of a square with a length of 2 ^ t in the upper left corner of the lattice (I, j, that is, the grids are black and can be transferred by enumeration length. The specifics are relatively simple ....
PS: I thought about this question for a long time without thinking about it. I glanced at it and thought about it. Then I began to think about it. After the question was completed, I went into a tragedy and continued wa... After reading the data, I found that I was wrong. After reading the data several times, I did not know what the problem was. I was not allowed to read other people's code, I found that the second paragraph was not carefully looked at, not only the case on the graph is classification .... I felt like I had to repeat it. At last, due to the small length limit, WA had a t_t time. Could I have any more weaknesses?
Code:
#include<cstdio>#include<iostream>using namespace std;const int mm=555;int f[mm][mm][11];int i,j,k,l,n,m,ans;char c;int check(int x,int y,int l){ if(x+l>=n||y+l>=m)return -1; int d[4]={f[x][y][k-1],f[x][y+l][k-1],f[x+l][y][k-1],f[x+l][y+l][k-1]}; int i,ret,s; for(i=0;i<4;++i) if(d[i]<0)return -1; for(i=0;i<4;++i) if(d[i]!=15)break; if(i==4)return 15; s=d[i]; for(ret=i=0;i<4;++i) if(d[i]!=15) { if(d[i]!=s)return -1; } else ret|=1<<i; if(l!=1&&s!=ret)return -1; return ret;}int main(){ while(~scanf("%d%d",&n,&m)) { for(i=0;i<n;++i) for(j=0;j<m;++j) { scanf(" %c",&c); f[i][j][0]=(c=='*')?15:0; } ans=0; for(k=1;(l=(1<<k))<=n&&l<=m;++k) for(i=0;i<n;++i) for(j=0;j<m;++j) ans+=(f[i][j][k]=check(i,j,l>>1))>-1&&k>1; printf("%d\n",ans); } return 0;}