| ||||||||||
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