input:
10 this is a dictionary that we will use for us 6 su as the dictonary us willl
output:
su is a misspelling of us as is a misspelling of is the is unknown dictonary is a misspelling of dictionary us is correct willl is a misspelling of will
题目大意:
单词有以下三种错误:1.多拼或少拼一个字符 2.拼错了一个字符 3.两个相邻的字符反了 4.不符合上述3种的为未知单词。
分析:
暴力模拟。根据4种错误情况和正确的情况直接经行模拟。
1.能找到相同单词
2.同长度的错误:(1)一个字符不同 (2)两个相邻字符反了。
(利用一个一个wrongCnt来记录有几个不同字符,1个则为(1)错误,2个则为(2)错误,其他,则需要继续判断)
3.长度差一的错误: (1)多了一个字符 (2)少了一个字符。
(利用一个sum来记录有多少个不同,1个为(1)或者为(2)的错误,其他则需要继续判断)
4.不满足2、3且找不到相等单词的错误(unknown)
code:
#define frp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll INF = 0x3f3f3f3f;
const ll inf = 0x7fffff;
const int maxn = 1e8;
const int MAXN = 10000;
int n, q;
string simpleArray[MAXN + 10];
void solve() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> simpleArray[i];
}
cin >> q;
for (int i = 0; i < q; i++) {
bool right = false;
string testString;
cin >> testString;
// cout << testString << ":\n";
for (int j = 0; j < n; j++) {
if (simpleArray[j] == testString) {
right = true;
cout << testString << " is correct" << endl;
break;
}
}
if (!right) {
bool isknown = true;
for (int j = 0; j < n; j++) {
int lenTest = testString.size(), lenSimple = simpleArray[j].size();
int wrongCnt = 0;
int pointOne, pointTwo;
pointOne = -1;
pointTwo = -1;
//一个字符错误或者两个字符反了
if (lenTest == lenSimple) {
for (int k = 0; k < lenTest; k++) {
if (testString[k] != simpleArray[j][k]) {
wrongCnt++;
if (wrongCnt == 1) {
pointOne = k;
} else if (wrongCnt == 2) {
pointTwo = k;
} else {
break;
}
}
}
if (wrongCnt == 1) {
cout << testString << " is a misspelling of " << simpleArray[j] << endl;
isknown = false;
break;
} else if (wrongCnt==2) {
if (testString[pointOne] == simpleArray[j][pointTwo] &&
testString[pointTwo] == simpleArray[j][pointOne]) {
cout << testString << " is a misspelling of " << simpleArray[j] << endl;
isknown = false;
break;
}
}
}
//多一个字符或者少一个字符
if(abs(lenSimple-lenTest)==1){
int xx=0,sum=0;
if(lenTest+1==lenSimple){
for(int k=0;k<lenSimple;k++){
if(testString[xx]==simpleArray[j][k]){
xx++;
}else{
sum++;
}
}
}else if(lenSimple+1==lenTest){
for(int k=0;k<lenTest;k++){
if(testString[k]==simpleArray[j][xx]){
xx++;
}else{
sum++;
}
}
}
if(sum==1){
cout<<testString<<" is a misspelling of "<<simpleArray[j]<<endl;
isknown=false;
break;
}
}
}
//不存在的单词
if (isknown) {
cout << testString << " is unknown" << endl;
}
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#ifdef frp
freopen("D:\\coding\\c_coding\\in.txt", "r", stdin);
// freopen("D:\\coding\\c_coding\\out.txt", "w", stdout);
#endif
solve();
return 0;
}