Pagini recente » Cod sursa (job #1807852) | Cod sursa (job #359471) | Cod sursa (job #1693897) | Cod sursa (job #3354742) | Cod sursa (job #3312890)
#include <bits/stdc++.h>
using namespace std;
ifstream f("matrix.in");
ofstream g("matrix.out");
int n, m, a[1001][1001], fr[26], dp[1001][1001], sum[1001][1001], v[1001][1001];
string s;
int main()
{
f >> n >> m;
for (int i=1; i<=n; ++i) {
f >> s;
for (int j=0; j<s.size(); ++j)
a[i][j+1] = s[j] - 'a';
}
for (int i=1; i<=m; ++i) {
f >> s;
for (int j=0; j<s.size(); ++j)
fr[ s[j]-'a' ]++;
}
for (int c=0; c<26; ++c) {
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
if (a[i][j] == c)
sum[i][j] = 1;
else sum[i][j] = 0;
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j)
sum[i][j] += (sum[i-1][j] + sum[i][j-1] - sum[i-1][j-1]);
for (int i=m; i<=n; ++i)
for (int j=m; j<=n; ++j) {
dp[i][j] = sum[i][j] - sum[i-m][j] - sum[i][j-m] + sum[i-m][j-m];
if (dp[i][j] == fr[c])
v[i][j] ++;
}
}
int ans = 0;
for (int i=m; i<=n; ++i)
for (int j=m; j<=n; ++j) {
if (v[i][j] == 26)
ans++;
}
g << ans;
return 0;
}