| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
第一道Trie题裸的Trie+裸的扫描
将要查找的东西扔到Trie里,然后对矩阵进行各种扫描,代码破了我的记录(除了打表),贴出纪念:
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
const int NMax=1010,CMax=26,PMax=NMax*NMax;
struct node
{
int num;
node *child[26];
}pool[PMax],*Trie;
int M,N,Q,L;
char A[NMax][NMax],buf[NMax];
pair<pair<int,int>,char> ans[NMax];
int main()
{
Trie=&pool[L++];
scanf("%d%d%d",&M,&N,&Q);
for(int i=0;i<M;i++)
scanf("%s",A+i);
for(int I=1;I<=Q;I++)
{
scanf("%s",buf);
int len=strlen(buf);
node *p=Trie;
for(int i=0;i<len;i++)
{
if(p->child[buf[i]-'A']==NULL) p->child[buf[i]-'A']=&pool[L++];
p=p->child[buf[i]-'A'];
}
p->num=I;
}
//C
for(int i=0;i<M;i++)
{
for(int j=0;j<N;j++)
{
int r=j;
while(r<N)
{
bool flag=1;
node *p=Trie;
for(int k=j;k<=r;k++)
{
if(p==NULL) {
flag=0;
break;
}
p=p->child[A[i][k]-'A'];
}
if(p==NULL) flag=0;
if(flag)
ans[p->num]=make_pair(make_pair(i,j),'C');
else break;
r++;
}
}
}
//G
for(int i=0;i<M;i++)
{
for(int j=N-1;j>=0;j--)
{
int r=j;
while(r>=0)
{
bool flag=1;
node *p=Trie;
for(int k=j;k>=r;k--)
{
if(p==NULL) {
flag=0;
break;
}
p=p->child[A[i][k]-'A'];
}
if(p==NULL) flag=0;
if(flag)
ans[p->num]=make_pair(make_pair(i,j),'G');
else break;
r--;
}
}
}
//puts("H1");
//E
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
int r=j;
while(r<M)
{
bool flag=1;
node *p=Trie;
for(int k=j;k<=r;k++)
{
if(p==NULL) {
flag=0;
break;
}
p=p->child[A[k][i]-'A'];
}
if(p==NULL) flag=0;
if(flag)
ans[p->num]=make_pair(make_pair(j,i),'E');
else break;
r++;
}
}
}
//puts("H2");
//A
for(int i=0;i<N;i++)
{
for(int j=0;j<M;j++)
{
int r=j;
while(r>=0)
{
bool flag=1;
node *p=Trie;
for(int k=j;k>=r;k--)
{
if(p==NULL) {
flag=0;
break;
}
p=p->child[A[k][i]-'A'];
}
if(p==NULL) flag=0;
if(flag)
ans[p->num]=make_pair(make_pair(j,i),'A');
else break;
r--;
}
}
}
//puts("H3");
//D
for(int i=0;i<M;i++) {
for(int j=0;j<N;j++) {
int x=i,y=j;
while(x<M && y<N) {
bool flag=1;
int x1=i,y1=j;
node *p=Trie;
while(x1<=x && y1<=y) {
if(p==NULL) {
flag=0;
break;
}
p=p->child[A[x1][y1]-'A'];
x1++,y1++;
}
if(p==NULL) flag=0;
if(flag)
ans[p->num]=make_pair(make_pair(i,j),'D');
else break;
x++,y++;
}
}
}
//puts("H4");
//H
for(int i=0;i<M;i++) {
for(int j=0;j<N;j++) {
int x=i,y=j;
while(x>=0 && y>=0) {
bool flag=1;
int x1=i,y1=j;
node *p=Trie;
while(x1>=x && y1>=y) {
if(p==NULL) {
flag=0;
break;
}
p=p->child[A[x1][y1]-'A'];
x1--,y1--;
}
if(p==NULL) flag=0;
if(flag)
ans[p->num]=make_pair(make_pair(i,j),'H');
else break;
x--,y--;
}
}
}
//puts("H5");
//F
for(int i=0;i<M;i++) {
for(int j=0;j<N;j++) {
int x=i,y=j;
while(x<M && y>=0) {
bool flag=1;
int x1=i,y1=j;
node *p=Trie;
while(x1<=x && y1>=y) {
if(p==NULL) {
flag=0;
break;
}
p=p->child[A[x1][y1]-'A'];
x1++,y1--;
}
if(p==NULL) flag=0;
if(flag)
ans[p->num]=make_pair(make_pair(i,j),'F');
else break;
x++,y--;
}
}
}
//puts("H6");
//B
for(int i=0;i<M;i++) {
for(int j=0;j<N;j++) {
int x=i,y=j;
while(x>=0 && y<N) {
bool flag=1;
int x1=i,y1=j;
node *p=Trie;
while(x1>=x && y1<=y) {
if(p==NULL) {
flag=0;
break;
}
p=p->child[A[x1][y1]-'A'];
x1--,y1++;
}
if(p==NULL) flag=0;
if(flag)
ans[p->num]=make_pair(make_pair(i,j),'B');
else break;
x--,y++;
}
}
}
//puts("H7");
for(int i=1;i<=Q;i++)
printf("%d %d %c\n",ans[i].first.first,ans[i].first.second,ans[i].second);
getchar();getchar();
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator