HDU

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 << ":
";
        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;
}

  

原文地址:https://www.cnblogs.com/visualVK/p/9675107.html