Untitled

mail@pastecode.io avatar
unknown
plain_text
a year ago
3.4 kB
11
Indexable
struct NODE {
    char name[20];
    int id;
    int count;
    bool band;
};
NODE NodePool[25000];
int nodeIndex;
 
struct TRIE {
    TRIE *Child[26];
    NODE *Recommend;
    NODE *Word;
    void init() {
        for (register int i = 0; i < 26; i++)
            Child[i] = 0;
        Recommend = Word = 0;
    }
};
 
TRIE Trie[500000];
TRIE root;
TRIE *Temp[20];
int trieIndex;
int wordId;
int tempIndex;
 
int mstrCPY(char *des, char *src) {
    int i = 0;
    while (src[i]) {
        des[i] = src[i];
        i++;
    }
    des[i] = 0;
    return i;
}
 
TRIE *AddWord(char *s) {
    int i = 0;
    tempIndex = 0;
    TRIE *cur = &root;
    while (s[i]) {
        int childIndex = s[i] - 'a';
        if (cur->Child[childIndex] == 0) {
            Trie[trieIndex].init();
            cur->Child[childIndex] = &Trie[trieIndex];
            trieIndex++;
        }
        cur = cur->Child[childIndex];
        Temp[tempIndex] = cur;
        tempIndex++;
        i++;
    }
    return cur;
}
 
void UpdateRecommend(NODE *w) {
    for (register int i = 0; i < tempIndex; i++) {
        if (Temp[i]->Recommend == 0)
            Temp[i]->Recommend = w;
        else if (w->count >= Temp[i]->Recommend->count)
            Temp[i]->Recommend = w;
    }
}
 
void init() {
    nodeIndex = trieIndex = 0;
    root.init();
}
 
void inputWord(char mWord[20]) {
    TRIE *t = AddWord(mWord);
    if (t->Word == 0) {
        NodePool[nodeIndex].band = false;
        NodePool[nodeIndex].count = 1;
        NodePool[nodeIndex].id = wordId;
        mstrCPY(NodePool[nodeIndex].name, mWord);
        t->Word = &NodePool[nodeIndex];
        UpdateRecommend(&NodePool[nodeIndex]);
        nodeIndex++;
    }
    else {
        if (t->Word->band == false) {
            t->Word->id = wordId;
            t->Word->count++;
            UpdateRecommend(t->Word);
        }
    }
    wordId++;
}
 
int recommend(char mUser[20], char mAnswer[20]) {
    int i = 0;
    TRIE *cur = &root;
    while (mUser[i]) {
        int childIndex = mUser[i] - 'a';
        if (cur->Child[childIndex] == 0) {
            cur = 0;
            break;
        }
        cur = cur->Child[childIndex];
        i++;
    }
    if (cur == 0 || cur->Recommend == 0)
        return mstrCPY(mAnswer, mUser);
    return mstrCPY(mAnswer, cur->Recommend->name);
}
 
void banWord(char mWord[20]) {
    TRIE *cur = AddWord(mWord);
    if (cur->Word == 0) {
        NodePool[nodeIndex].band = true;
        cur->Word = &NodePool[nodeIndex];
        nodeIndex++;
    }
    else {
        cur->Word->band = true;
        NODE *max = 0;
        NODE *x = 0;
        for (register int i = tempIndex - 1; i >= 0; i--) {
            if (Temp[i]->Recommend == cur->Word) {
                max = 0;
                for (register int j = 0; j < 26; j++) {
                    if (Temp[i]->Child[j] && Temp[i]->Child[j]->Recommend) {
                        x = Temp[i]->Child[j]->Recommend;
                        if (max == 0)
                            max = x;
                        else if (x->count > max->count || (x->count == max->count && x->id > max->id))
                            max = x;
                    }
                }
                Temp[i]->Recommend = max;
            }
            else
                return;
        }
    }
}