| ||||||||||
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 |
无尽的WA...,大伙帮看下,用GaryTang给的数据测试没问题#include<iostream> #include<fstream> using namespace std; #define KEY_MAX 9 #define WORD_MAX 1000 char* wordstrs[WORD_MAX]={0}; int indexofchar['z'-'a'+1]; struct word { char * str; int weight; word():str(0),weight(0) {} }; class numnode { char* _prev; char* _next; int _weight_next; int _weight_prev; numnode* _childs[KEY_MAX]; int _end;//end of word str index public: numnode():_weight_next(0),_weight_prev(0),_prev(0),_next(0),_end(0) { for(int i=KEY_MAX-1;i>=0;--i){ this->_childs[i]=0;} } ~numnode() { if(this->_childs) { for(int i=KEY_MAX-1;i>=0;--i) if(this->_childs[i]) delete this->_childs[i]; } } void putword(word& wo,int at) { int i; if(at) { if(at==2&&wo.str[at-2]=='f'&&wo.str[at-1]=='i') cout<<'g'; if(this->_prev) { for(i=0;i<at;++i) { if(this->_prev[i]!=wo.str[i]) break; } if(i==at) { //wo.weight+=this->_weight_prev; this->_weight_prev+=wo.weight; } else { i=0; if(this->_next) { for(;i<at;++i) { if(this->_next[i]!=wo.str[i]) break; } } if(i==at) { //wo.weight+=this->_weight_next; this->_weight_next+=wo.weight; if(this->_weight_next>this->_weight_prev) { this->_prev=this->_next; this->_weight_prev=this->_weight_next; this->_end=at; this->_next=0; } } else { if(wo.weight>this->_weight_prev) { this->_prev=wo.str; this->_weight_prev=wo.weight; this->_next=0; this->_end=at; } else { this->_next=wo.str; this->_weight_next=wo.weight; } } } } else { this->_prev=wo.str; this->_weight_prev=wo.weight; this->_end=at; } } if(wo.str[at]) { int index=indexofchar[wo.str[at]-'a']; if(!(this->_childs[index])) this->_childs[index]=new numnode(); this->_childs[index]->putword(wo,at+1); } } numnode* next(int num) { return this->_childs[num-1]; } void output(ostream& out) { for(int i=0;i<this->_end;++i) out<<this->_prev[i]; } }; void init() { int i=0; while(i<'d'-'a') indexofchar[i++]=1; while(i<'g'-'a') indexofchar[i++]=2; while(i<'j'-'a') indexofchar[i++]=3; while(i<'m'-'a') indexofchar[i++]=4; while(i<'p'-'a') indexofchar[i++]=5; while(i<'t'-'a') indexofchar[i++]=6; while(i<'w'-'a') indexofchar[i++]=7; while(i<'z'-'a') indexofchar[i++]=8; indexofchar[i]=8; } void deal(istream&fin,ostream&fout) { int i,j,m,n; char ch; numnode* mainnode; numnode* prevnode; char wordinput[102]; word oneword; int times,go; fin>>times; init(); for(go=1;go<=times;++go) { mainnode=new numnode(); fin>>m; for(n=m-1;n>=0;--n) { fin>>wordinput; i=0; while(wordinput[i++]); oneword.str=new char[i]; wordstrs[n]=oneword.str; for(--i;i>=0;--i) oneword.str[i]=wordinput[i]; fin>>oneword.weight; mainnode->putword(oneword,0); } fout<<"Scenario #"<<go<<':'<<endl; fin>>j; for(--j;j>=0;--j) { prevnode=mainnode; while(fin>>ch&&ch>'1') { if(prevnode) prevnode=prevnode->next(ch-'0'); if(prevnode) prevnode->output(fout); else fout<<"MANUALLY"; fout<<endl; } fout<<endl; } fout<<endl; for(--m;m>=0;--m) { if(wordstrs[m]) { delete wordstrs[m]; wordstrs[m]=0; } } delete mainnode; } } int main() { deal(cin,cout); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator