Examples
input
4 5
XBOIC
DKIRA
ALBOA
BHGES
3
BOLA
CASA
BOI
output
3
input
3 3
AAB
ABA
BAA
2
ABA
BBB
output
3
input
2 4
AAAA
AAAA
2
AAA
BBB
output
0
题意
给你一个二维矩阵,里面放着大写字母,给你n个单词(严格来说并不是),你需要在矩阵中找到尽量多的单词块,单词块中的各各字母的个数与其中一个单词相同;
问:存在某些小方格,里面的字母被多个(>1)单词的单词块共用,求小方格的数量;
思路
数据范围很小,考虑直接暴力做,每次可以向四个方向(右,下,左下,右下)去搜索
代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mod 998244353
#define maxn 200005
int G[50][50];
int GG[50][50];
int len[50];
int n, m, q;
map<int, int> vis[50][50];
bool compare(int nw[], int id){
for(int i=1;i<=26;++i)
if(nw[i]^GG[id][i]) return 0;
return 1;
}
void dfs(int x, int y, int id){
if(y+len[id]-1<=m){
int nw[30]={0};
for(int i=y;i<y+len[id];++i) nw[G[x][i]]++;
if(compare(nw, id)){
for(int i=y;i<y+len[id];++i) vis[x][i][id]=1;
}
}
if(x+len[id]-1<=n){
int nw[30]={0};
for(int i=x;i<x+len[id];++i) nw[G[i][y]]++;
if(compare(nw, id)){
for(int i=x;i<x+len[id];++i) vis[i][y][id]=1;
}
}
if(y+len[id]-1<=m && x+len[id]-1<=n){
int nw[30]={0};
for(int i=x, j=y;i<x+len[id];++i, ++j) nw[G[i][j]]++;
if(compare(nw, id)){
for(int i=x, j=y;i<x+len[id];++i, ++j) vis[i][j][id]=1;
}
}
if(x+len[id]-1<=n && y-len[id]+1>0){
int nw[30]={0};
for(int i=x, j=y, t=1;t<=len[id];++t, ++i, --j) nw[G[i][j]]++;
if(compare(nw, id)){
for(int i=x, j=y, t=1;t<=len[id];++t, ++i, --j) vis[i][j][id]=1;
}
}
if(y==m) y=1, ++x;
else ++y;
if(x<=n) dfs(x, y, id);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i){
string str; cin>>str;
for(int j=0;j<m;++j) G[i][j+1]=str[j]-'A'+1;
}
cin>>q;
for(int i=1;i<=q;++i){
string str; cin>>str;
len[i]=str.size();
for(int j=0;j<len[i];++j) GG[i][str[j]-'A'+1]++;
dfs(1, 1, i);
}
int ans=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j) if(vis[i][j].size()>1) ans++;
cout<<ans<<endl;
return 0;
}