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+排序sort#include<iostream> #include<fstream> #include<cstdio> #include<algorithm> #include<cstring> #include<ctime> #include<cstdlib> using namespace std; const int BRANCH_NUM=30; const int MAX_LEN=20; typedef struct node { int idx; char str[MAX_LEN]; }node; node record[10000]; typedef struct trie_node { int idx; trie_node* branch[BRANCH_NUM]; void init() { idx=0; memset(branch,NULL,sizeof(branch)); } }trie_node; trie_node m_pool[100000];//这个地方开小了,WA int nIndex; class trie_tree { protected: trie_node* root; public: trie_tree(); void insert(char word[],int idx); int search(char word[]); }; trie_tree::trie_tree() { root=&m_pool[nIndex++]; root->init(); } void trie_tree::insert(char word[],int idx) { int pos=0; trie_node* location=root; int id; //bool res=true; while('\0'!=word[pos]) { id=word[pos]-'a'; if(NULL==location->branch[id]) { location->branch[id]=&m_pool[nIndex++]; location->branch[id]->init(); } location=location->branch[id]; //if(location->isStr) //res=false; pos++; } location->idx=idx; } int trie_tree::search(char word[]) { int pos=0; trie_node* location=root; while('\0'!=word[pos] && NULL!=location) { location=location->branch[word[pos]-'a']; pos++; } if(NULL!=location && '\0'==word[pos]) return location->idx; return 0; } void deleteLetter(char from[],char to[],int nIndex) { int length=strlen(from); for(int i=0;i<nIndex;i++) to[i]=from[i]; for(int i=nIndex;i<length-1;i++) to[i]=from[i+1]; to[length-1]='\0'; } void insert(char from[],char to[],int nIndex,char c) { int length=strlen(from); for(int i=0;i<nIndex;i++) to[i]=from[i]; to[nIndex]=c; for(int i=nIndex;i<length;i++) to[i+1]=from[i]; to[length+1]='\0'; } void modify(char from[],char to[],int nIndex,char c) { strcpy(to,from); to[nIndex]=c; } inline bool cmp(const node& a,const node& b) { return a.idx<b.idx; } int main() { //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); char str[MAX_LEN]; char temp[MAX_LEN]; trie_tree t; int idx=1; while(scanf("%s",str)!=EOF) { if('#'==str[0]) break; t.insert(str,idx++); } int nCount=0; while(scanf("%s",str)!=EOF) { if('#'==str[0]) break; if(t.search(str)) { printf("%s is correct\n",str); } else { int x; nCount=0; int length=strlen(str); for(int i=0;i<length;i++) { deleteLetter(str,temp,i); // printf("%s\n",temp); if(0!=(x=t.search(temp))) { strcpy(record[nCount++].str,temp); record[nCount-1].idx=x; } for(int j=0;j<26;j++) { modify(str,temp,i,'a'+j); //printf("%s\n",temp); if(0!=(x=t.search(temp))) { strcpy(record[nCount++].str,temp); record[nCount-1].idx=x; } insert(str,temp,i,'a'+j); // printf("%s\n",temp); if(0!=(x=t.search(temp))) { strcpy(record[nCount++].str,temp); record[nCount-1].idx=x; } } } for(int i=0;i<26;i++) { insert(str,temp,length,'a'+i); //printf("%s\n",temp); if(0!=(x=t.search(temp))) { strcpy(record[nCount++].str,temp); record[nCount-1].idx=x; } } sort(record,record+nCount,cmp); printf("%s:",str); if(nCount) printf(" %s",record[0].str); for(int i=1;i<nCount;i++) { if(record[i].idx!=record[i-1].idx)//还有这里 //注意判重,这是我出错的第二个地方 printf(" %s",record[i].str); } printf("\n"); } } return 0; } /* int main() { freopen("input.txt","w",stdout); srand(time(NULL)); for(int i=0;i<10000;i++) { int length=(rand()%15)+1; for(int j=0;j<length;j++) cout<<char('a'+(rand()%26)); cout<<endl; } cout<<"#"<<endl; for(int i=0;i<50;i++) { int length=(rand()%15)+1; for(int j=0;j<length;j++) cout<<char('a'+(rand()%26)); cout<<endl; } 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