poj1035 字典匹配
2015-01-09 20:55
246 查看
//终于过了,主要思想是强制计算所有可能长度对应的子字典列表。 //用空间换时间 1324K 938MS #include <iostream> #include <string> using namespace std; string dic[10005]; string check; int len[10005]; int indexLen[16][10005]; int cntt[16]; int subList[16][10005]; void bubbleSort(int* a, int s) { for(int i = 0; i < s - 1; i++) { for(int j = 0; j < s - 1 - i; j++) { if(a[j] > a[j + 1]) { int temp = a[j]; a[j] = a[j + 1]; a[j + 1] = temp; } } } } bool match(string a, string b) { //a字典 b待匹配 if(a.length() > b.length()) { int cnt = 0; for(int i = 0; i < b.length(); i++) { int j = i + cnt; if(a[j] != b[i]) { cnt++; i--; if(cnt>1) break; } } if(cnt <= 1) return true; } else if(a.length() < b.length()) { int cnt = 0; for(int i = 0; i < a.length(); i++) { int j = i + cnt; if(b[j] != a[i]) { cnt++; i--; if(cnt > 1) break; } } if(cnt <= 1) return true; } return false; } int main() { memset(indexLen, -1, sizeof(indexLen)); memset(cntt, 0, sizeof(cntt)); int k = 1; getline(cin, dic[0]); len[0] = (int)dic[0].length(); indexLen[len[0]][cntt[len[0]]++] = 0; while(dic[k - 1].compare("#") != 0) { getline(cin, dic[k]); len[k] = dic[k].length(); indexLen[len[k]][cntt[len[k]]++] = k; k++; } k--; //用大堆数据弥补TLE int subNum[16]; memset(subNum, 0, sizeof(subNum)); for(int j = 1; j < 16; j++) { for(int i = 0; j - 1 >= 0 && i < cntt[j - 1]; i++) { if(indexLen[j - 1][i] < k) subList[j][subNum[j]++] = indexLen[j - 1][i]; } for(int i = 0; i < cntt[j]; i++) { if(indexLen[j ][i] < k) subList[j][subNum[j]++] = indexLen[j][i]; } for(int i = 0; i < cntt[j + 1]; i++) { if(indexLen[j + 1][i] < k) subList[j][subNum[j]++] = indexLen[j + 1][i]; } bubbleSort(subList[j], subNum[j]); } getline(cin, check); while(check.compare("#") != 0) { int checkLen = check.length(); cout<<check; bool ok = false; for(int i = 0; i < subNum[checkLen]; i++) { if(dic[subList[checkLen][i]].compare(check) == 0) { cout<<" is correct"; ok = true; break; } } if(!ok) { cout<<":"; for(int i = 0; i < subNum[checkLen]; i++) { int cnt = 0; if(dic[subList[checkLen][i]].length() == checkLen) { for(int j = 0; j < checkLen; j++) if(dic[subList[checkLen][i]][j] != check[j]) cnt++; if(cnt == 1) cout<<" "<<dic[subList[checkLen][i]]; } else if(match(dic[subList[checkLen][i]] ,check)) cout<<" "<<dic[subList[checkLen][i]]; } } cout<<endl; getline(cin, check); } return 0; }
相关文章推荐
- poj 1035 string 的匹配
- poj 3267 最少需要删除多少个多余字符来匹配字典中的单词
- poj乱序字典匹配(map)
- POJ 1035 Spell checker(字典)
- poj1035 串-字典修改查找问题
- POJ 1035 Spell checker(字符串简单匹配)
- POJ 1035 Spell checker (模拟)
- POJ - 1035 Spell checker解题报告
- POJ 1904 King's Quest ★(强连通分量:可行完美匹配边)
- poj 1469 COURSES 最大匹配
- (Relax 数论1.25)POJ 1850 Code(求某个字符串在字典中的位置)
- 【留坑】 POJ2503 注意输入输出&&几种数据结构的复习、比较(线性表建立的字典 || 树建立的字典_即Trie || hash || map)
- POJ-3686 The Windy's 最小权匹配
- poj 1469 COURSES (二分匹配)
- POJ 1035 Fermat vs. Pythagoras(毕达哥拉斯三元组)
- POJ -2289 -Jamie's Contact Groups (二分图多重匹配)
- poj 1325 Machine Schedule(二部图最小点覆盖集 最大匹配 匈牙利算法)(简单)
- POJ, 2418 Hardwood Species(按照字典顺序输出单词并且输出此单词出现的百分比)
- POJ 2536 Gopher II(二分图最大匹配)
- POJ 3565 Ants(最佳完美匹配)