Pagini recente » Cod sursa (job #114172) | Cod sursa (job #2526605) | Cod sursa (job #3272086) | Cod sursa (job #2306200) | Cod sursa (job #2970379)
#include<bits/stdc++.h>
using namespace std;
ifstream fin("matrix.in");
ofstream fout("matrix.out");
char a[1001][1001];
int n, X1, Y1, X2, Y2, r[26], f[26];
bitset <26> ok;
inline void goDown()
{
for (int j = Y1; j <= Y2; j++)
ok[a[X1][j] - 'a'] = ((--f[a[X1][j] - 'a']) == r[a[X1][j] - 'a']);
X1++;
X2++;
for (int j = Y1; j <= Y2; j++)
ok[a[X2][j] - 'a'] = ((++f[a[X2][j] - 'a']) == r[a[X2][j] - 'a']);
}
inline void goUp()
{
for (int j = Y1; j <= Y2; j++)
ok[a[X2][j] - 'a'] = ((--f[a[X2][j] - 'a']) == r[a[X2][j] - 'a']);
X2--;
X1--;
for (int j = Y1; j <= Y2; j++)
ok[a[X1][j] - 'a'] = ((++f[a[X1][j] - 'a']) == r[a[X1][j] - 'a']);
}
inline void goRight()
{
for (int i = X1; i <= X2; i++)
ok[a[i][Y1] - 'a'] = ((--f[a[i][Y1] - 'a']) == r[a[i][Y1] - 'a']);
Y1++;
Y2++;
for (int i = X1; i <= X2; i++)
ok[a[i][Y2] - 'a'] = ((++f[a[i][Y2] - 'a']) == r[a[i][Y2] - 'a']);
}
inline void goLeft()
{
for (int i = X1; i <= X2; i++)
ok[a[i][Y2] - 'a'] = ((--f[a[i][Y2] - 'a']) == r[a[i][Y2] - 'a']);
Y2--;
Y1--;
for (int i = X1; i <= X2; i++)
ok[a[i][Y1] - 'a'] = ((++f[a[i][Y1] - 'a']) == r[a[i][Y1] - 'a']);
}
int main()
{
ok.set();
int aux;
fin >> n >> aux;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
fin >> a[i][j];
for (int i = 1; i <= aux; i++)
for (int j = 1; j <= aux; j++)
{
char c;
fin >> c;
r[c - 'a']++;
}
int dir;
/*
0 - Up
1 - Right
2 - Down
3 - Left
*/
dir = 2;
X1 = Y1 = 1;
X2 = Y2 = aux;
for (int i = 1; i <= aux; i++)
for (int j = 1; j <= aux; j++)
ok[a[i][j] - 'a'] = ((++f[a[i][j] - 'a']) == r[a[i][j] - 'a']);
int cnt = 0;
while (true)
{
cnt += ok.all();
if (dir == 0)
{
if (X1 == 1)
{
if (Y2 == n)
break;
goRight();
dir = 2;
}
else
goUp();
}
else // dir == 2
{
if (X2 == n)
{
if (Y2 == n)
break;
goRight();
dir = 0;
}
else
goDown();
}
}
fout << cnt;
return 0;
}