很简单的1a了,代码也很好写。思路也很简单,直接暴力就是了,数据很弱因为。没有任何优化,391ms。
/*
POJ: 1035 Spell checker
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
vector<string> vec;
vector<string> res;
bool compare(string str1, string str2)
{
int i = 0, j = 0;
int diff = 0;
while(i < str1.size() && j < str2.size()) {
if(str1[i] == str2[j]) {
i++;
j++;
}
else if(diff == 0) {
i++;
diff++;
}
else if(diff > 0) {
diff++;
break;
}
}
if(diff <= 1)
return true;
return false;
}
bool canReplace(string str1, string str2)
{
int diff = 0;
for(int i = 0; i < str1.size(); i++) {
if(str1[i] != str2[i])
diff++;
if(diff > 1)
break;
}
if(diff > 1)
return false;
return true;
}
int main()
{
string str;
//freopen("data.in", "rb", stdin);
vec.clear();
while(cin >> str, str != "#") {
vec.push_back(str);
}
while(cin >> str, str != "#") {
res.clear();
bool flag = false;
cout << str;
for(vector<string>::iterator it = vec.begin(); it != vec.end(); it++) {
if(abs((int)str.size() - (int)(*it).size()) == 1) {
if(str.size() > (*it).size()) {
if(compare(str, *it))
res.push_back(*it);
}
else if(compare(*it, str))
res.push_back(*it);
}
else if(str.size() == (*it).size()) {
if(*it == str) {
flag = true;
printf(" is correct\n");
break;
}
else if(canReplace(str, *it))
res.push_back(*it);
}
}
if(!flag) {
vector<string>::iterator it = res.begin();
cout << ":";
while(it != res.end()) {
cout << " " << *it;
it++;
}
cout << endl;
}
}
return 0;
}