| ||||||||||
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 |
小弟这个hash为什么会WA呢?? 哪位兄弟给个我过不了的数据?难道是冲突问题?In Reply To:Re:用map就行,注意句子开头不是字母的情况 Posted by:dalonghenin at 2008-11-09 23:11:36 #include <iostream> #include "string" #include <algorithm> using namespace std; const int prim=1000001; char aim[10002][30]; struct h { int key; int num; int index; char a,b; }hash[prim]; char p[100000]; void insert(long v,int x,char a,char b) { long key=v; while(key<0) key+=prim; if(key>=prim) key=key%prim; while(hash[key].num!=0) { if(hash[key].key==v&&hash[key].a==a&&hash[key].b==b) { hash[key].num++; hash[key].index=x; return; } key=(key+1)%prim; } hash[key].num=1; hash[key].key=v; hash[key].index=x; hash[key].a=a;hash[key].b=b; } int search(long v,char a,char b) { long key=v; while(key<0) key+=prim; if(key>=prim) key=key%prim; while(hash[key].num!=0) { if(hash[key].key==v&&hash[key].a==a&&hash[key].b==b) return hash[key].index; key=(key+1)%prim; } return -1; } int main() { int sum; char q[30]; int i,j,index=0; for(i=0;i<prim;i++) { hash[i].num=0; } while(gets(p)) { j=0; if(strcmp(p,"DICTIONARY_DEFINE_OVER")==0) break; for(i=0;i<strlen(p);i++) { if(p[i]==' ') { aim[index++][j]='\0'; j=0; } else { aim[index][j++]=p[i]; } } aim[index++][j]='\0'; } int k; for(i=0;i<index;i++) { for(j=0;j<strlen(aim[i]);j++) { q[j]=aim[i][j]; } q[j]='\0'; sort(q,q+j); sum=0; for(k=0;k<j;k++) { sum=sum*26+q[k]-'a'+1; sum%=prim; } insert(sum,i,aim[i][0],aim[i][j-1]); } string s; while(gets(p)) { char a,b; j=0; for(i=0;i<strlen(p);i++) { if(p[i]<'a'||p[i]>'z') { if(j!=0) { a=q[0]; b=q[j-1]; q[j]='\0'; s.assign(q); sort(q,q+j); sum=0; for(k=0;k<j;k++) { sum=sum*26+q[k]-'a'+1; sum%=prim; } int aa=search(sum,a,b); if(aa!=-1) { cout<<aim[aa]; } else cout<<s; } cout<<p[i]; j=0; } else { q[j++]=p[i]; } } if(j!=0) { a=q[0]; b=q[j-1]; q[j]='\0'; s.assign(q); sort(q,q+j); sum=0; for(k=0;k<j;k++) { sum=sum*26+q[k]-'a'+1; sum%=prim; } int aa=search(sum,a,b); if(aa!=-1) { cout<<aim[aa]; } else cout<<s; } cout<<endl; } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator