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了一次,注意重复的只输出一次!附代妈//============================================================================ // Name : main1035.cpp // Author : // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================ #include <iostream> #include <string> #include <vector> using namespace std; int cnt = 1; string dict[10001]; int partion(vector<int>& array, int p, int r) { int x = array[r]; int i = p - 1;//注意这点,把i设成负值,然后作为移动的标志 int j; for (j = p; j < r; j++) { if (array[j] < x) { i++; int temp = array[j]; array[j] = array[i]; array[i] = temp; } } int temp = array[j]; array[j] = array[i + 1]; array[i + 1] = temp; return i+1;//返回的应该是交换后的哨兵的位置 } //递归解决每个划分后的小 void quickSort(vector<int>& array, int p, int r) { if (p < r) { int q = partion(array, p, r); quickSort(array, p, q - 1); quickSort(array, q + 1, r); } } class node{ public: node* sub[27]; int num; node(){ num = 0; //cnt++; for(int i = 0; i < 27; i++) sub[i] = NULL; } }; node* root; void buildTree(){ root = new node(); string s; while(getline(cin, s)){ if(s == "#") return; dict[cnt] = s; node *iter = root; int len = s.length(); for(int i = 0; i < len; i++){ node *next = iter->sub[s[i] - 'a']; if(next == NULL){ node *temp = new node(); iter->sub[s[i] - 'a'] = temp; iter = iter->sub[s[i] - 'a']; } else{ iter = next; } //if(s == "award") } node *newN = new node(); iter->sub[26] = newN; iter = iter->sub[26]; iter->num = cnt; cnt++; } } int have(node* start, string suffix){ node *iter = start; int len = suffix.length(); //int prc = len; for(int i = 0; i < len; i++){ //cout << (int)(suffix[i]-'a') << endl; if(iter->sub[suffix[i]-'a'] == NULL){ return 0; } //cout << 233 << endl; iter = iter->sub[suffix[i] - 'a']; } if(iter->sub[26] == NULL) return 0; return iter->sub[26]->num; } int main() { string ss = "test"; //cout << "q" + ss.substr(4); buildTree(); //cout << root << endl; string s; while(getline(cin, s)){ if(s == "#") return 0; if(have(root, s) > 0){ //cout << have(root, s) << endl; cout << s << " is correct\n"; continue; } vector<int> res; int len = s.length(); //int cnt = 0; //下面开始考虑增加一个 node *iter = root; for(int i = 0; i <= len; i++){ string sfx = s.substr(i); //cout << iter << endl; for(char c = 'a'; c <= 'z'; c++){ //cout << c + sfx << endl; //cout << iter << endl; int result = have(iter, c + sfx); //cout << i << " " << c << endl; if(result > 0) res.push_back(result); //cout << result << endl; } if(i != len) iter = iter->sub[s[i] - 'a']; if(iter == NULL) break; } //cout << 1 << endl; //替换一个 iter = root; for(int i = 0; i < len; i++){ string sfx = s.substr(i+1); for(char c = 'a'; c <= 'z'; c++){ int result = have(iter, c + sfx); if(result > 0) res.push_back(result); } iter = iter->sub[s[i] - 'a']; if(iter == NULL) break; } //删掉一个 if(len > 1){ iter = root; for(int i = 0; i < len; i++){ string sfx = s.substr(i+1); int result = have(iter, sfx); if(result > 0) res.push_back(result); iter = iter->sub[s[i] - 'a']; if(iter == NULL) break; } } if(res.empty()){ cout << s << ":" << endl; continue; } int sz = res.size(); quickSort(res, 0, sz-1); cout << s << ":"; int idx = 0; for(int i = 0; i < sz; i++) { if(res[i] == idx) continue;//这个不能少,否则重复输出!!! idx = res[i]; cout << " " << dict[res[i]]; } cout << endl; } //cout << "!!!Hello World!!!" << endl; // prints !!!Hello World!!! return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator