Pagini recente » Cod sursa (job #2513177) | Cod sursa (job #678560) | Borderou de evaluare (job #1773463) | Borderou de evaluare (job #647410) | Cod sursa (job #2970380)
#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;
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, i, j;
while (true)
{
cnt += ok.all();
if (dir == 0)
{
if (X1 == 1)
{
if (Y2 == n)
break;
for (i = X1; i <= X2; i++)
ok[a[i][Y1] - 'a'] = ((--f[a[i][Y1] - 'a']) == r[a[i][Y1] - 'a']);
Y1++;
Y2++;
for (i = X1; i <= X2; i++)
ok[a[i][Y2] - 'a'] = ((++f[a[i][Y2] - 'a']) == r[a[i][Y2] - 'a']);
dir = 2;
}
else
{
for (j = Y1; j <= Y2; j++)
ok[a[X2][j] - 'a'] = ((--f[a[X2][j] - 'a']) == r[a[X2][j] - 'a']);
X2--;
X1--;
for (j = Y1; j <= Y2; j++)
ok[a[X1][j] - 'a'] = ((++f[a[X1][j] - 'a']) == r[a[X1][j] - 'a']);
}
}
else // dir == 2
{
if (X2 == n)
{
if (Y2 == n)
break;
for (i = X1; i <= X2; i++)
ok[a[i][Y1] - 'a'] = ((--f[a[i][Y1] - 'a']) == r[a[i][Y1] - 'a']);
Y1++;
Y2++;
for (i = X1; i <= X2; i++)
ok[a[i][Y2] - 'a'] = ((++f[a[i][Y2] - 'a']) == r[a[i][Y2] - 'a']);
dir = 0;
}
else
{
for (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']);
}
}
}
fout << cnt;
return 0;
}