题意:
给你一个字符矩阵,然后给你若干个单词,问你这个单词是否在矩阵中出现过,
在矩阵中,横向,竖向或者斜着。
每个单词是一个,不会重复出现。
输出单词在矩阵中出现的靠左上角的第一个位置,
思路;
我们就先把单词建字典树,然后我们枚举矩阵中的起始单词位置。就好了。
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5;
const int dx[3] = {0,1,1};
const int dy[3] = {1,0,1};
int tree[N][30];
int sum[N],tot;
char s[600][600],t[600];
int x[N],y[N],n,m;
void insert(int tt){
int root = 0,id,len;
len = strlen(t);
for (int i = 0; i < len; i++){
id = t[i] - 'A';
if (!tree[root][id]) tree[root][id] = ++tot;
root = tree[root][id];
}
sum[root] = tt;
return;
}
void find(int xx, int yy, int k){
int u = xx, v = yy;
int id,root = 0;
while(u < n && v < m){
id = s[u][v] - 'A';
if (tree[root][id] == 0) return ;
root = tree[root][id];
if (sum[root] != -1){
if (x[sum[root]] == -1){
x[sum[root]] = xx; y[sum[root]] = yy;
}
}
u += dx[k]; v += dy[k];
}
}
int main() {
scanf("%d%d",&n,&m); gets(t);
for (int i = 0; i < n; i++) gets(s[i]);
gets(t);
memset(sum,-1,sizeof(sum));
memset(x,-1,sizeof(x));
memset(y,-1,sizeof(y));
int tt = 0;
while(gets(t)){
if (t[0] == '-') break;
insert(tt++);
}
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
for (int k = 0; k < 3; k++)
find(i,j,k);
for (int i = 0; i < tt; i++){
printf("%d %d\n",x[i],y[i]);
}
return 0;
}