Advertisement
o0oflashero0o

TrieCheating

Mar 22nd, 2014
949
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <string>
  5. #include <set>
  6. #include <algorithm>
  7.  
  8. using namespace std;
  9.  
  10. #define ALPHABET_SIZE 33
  11. const char ConsoleSample[ALPHABET_SIZE] = { -96, -95, -94, -93, -92, -91, -15, -90, -89, -88, -87, -86, -85, -84, -83, -82, -81, -32, -31, -30, -29, -28, -27, -26, -25, -24, -23, -20, -21, -22, -19, -18, -17 };
  12. const char FstreamSample[ALPHABET_SIZE] = { -32, -31, -30, -29, -28, -27, -72, -26, -25, -24, -23, -22, -21, -20, -19, -18, -17, -16, -15, -14, -13, -12, -11, -10, -9, -8, -7, -4, -5, -6, -3, -2, -1 };
  13.  
  14. typedef struct {
  15.     unsigned child[ALPHABET_SIZE];
  16.     bool isLeaf;
  17. } node;
  18. node NullNode = {NULL};
  19.  
  20. vector<node> Trie;
  21. set<string> Res;
  22. vector<string> Output;
  23.  
  24. void TrieAddWord(string &S) {
  25.     unsigned CurrentNode(0);
  26.  
  27.     for (auto i(S.begin()); i != S.end(); ++i) {
  28.         if (Trie[CurrentNode].child[*i] == 0) {
  29.             Trie.push_back(NullNode);
  30.             Trie[CurrentNode].child[*i] = Trie.size() - 1;
  31.             CurrentNode = Trie.size() - 1;
  32.         }
  33.         else {
  34.             CurrentNode = Trie[CurrentNode].child[*i];
  35.         }
  36.     }
  37.     Trie[CurrentNode].isLeaf = true;
  38. }
  39.  
  40. void EncodeString(string &S, const char Sample[]) {
  41.     for (auto i(S.begin()); i != S.end(); ++i) {
  42.         for (char j(0); j != ALPHABET_SIZE; ++j) {
  43.             if (*i == Sample[j]) {
  44.                 *i = j;
  45.                 break;
  46.             }
  47.         }
  48.     }
  49. }
  50.  
  51. void LoadDictonary(char *Filename) {
  52.     ifstream in(Filename);
  53.     string Buff;
  54.  
  55.     while (!in.eof()) {
  56.         in >> Buff;
  57.         EncodeString(Buff, FstreamSample);
  58.         TrieAddWord(Buff);
  59.     }
  60.  
  61.     in.close();
  62. }
  63.  
  64. bool cmp(string A, string B) {
  65.     if (A.size() >= B.size()) {
  66.         return false;
  67.     }
  68.     else return true;
  69. }
  70.  
  71. void GuessWordBypass(unsigned N, __int8 X, bool Used[], string &S, string W, short &L) {
  72.     if (W.size() > L) return;
  73.     for (__int8 i(0); i != S.size(); ++i) {
  74.         if (i == X) continue;
  75.         if (!Used[i]) {
  76.             if (Trie[N].child[S[i]] != 0) {
  77.                 Used[i] = true;
  78.                 GuessWordBypass(Trie[N].child[S[i]], i, Used, S, W + S[i], L);
  79.                 Used[i] = false;
  80.             }
  81.         }
  82.         if (Trie[N].isLeaf && W.size() == L) {
  83.             Res.insert(W);
  84.         }
  85.     }
  86. }
  87.  
  88. void GuessWord(string &S, short &L) {
  89.     bool *Used = new bool [S.size()];
  90.     memset(Used, 0, S.size());
  91.     for (__int8 i(0); i != S.size(); ++i) {
  92.         if (Trie[0].child[S[i]] != 0) {
  93.             Used[i] = true;
  94.             GuessWordBypass(Trie[0].child[S[i]], i, Used, S, S.substr(i, 1), L);
  95.             Used[i] = false;
  96.         }
  97.     }
  98.     delete [] Used;
  99. }
  100.  
  101. void WordsmaniaCheatBypass(unsigned N, __int8 X, bool Used[], string &S, string W) {
  102.     __int8 TransitDenied[11] = {0};
  103.     for (__int8 i(-2); i <= 2; i += 2)
  104.         TransitDenied[i + 5] = true;
  105.  
  106.     if (X % 4 == 0)
  107.         for (__int8 i(-5); i <= 3; i += 4)
  108.             TransitDenied[i + 5] = true;
  109.  
  110.     if (X < 4)
  111.         for (__int8 i(-5); i <= -3; ++i)
  112.             TransitDenied[i + 5] = true;
  113.  
  114.     if (X % 4 == 3)
  115.         for (__int8 i(-3); i <= 5; i += 4)
  116.             TransitDenied[i + 5] = true;
  117.  
  118.     if (X >= 12)
  119.         for (__int8 i(3); i <= 5; ++i)
  120.             TransitDenied[i + 5] = true;
  121.  
  122.     for (__int8 i(-5); i <= 5; ++i) {
  123.         if(TransitDenied[i + 5]) continue;
  124.         __int8 tmp = X + i;
  125.         if (!Used[tmp]) {
  126.             if (Trie[N].child[S[tmp]] != 0) {
  127.                 Used[tmp] = true;
  128.                 WordsmaniaCheatBypass(Trie[N].child[S[tmp]], tmp, Used, S, W + S[tmp]);
  129.                 Used[tmp] = false;
  130.             }
  131.         }
  132.         if (Trie[N].isLeaf) {
  133.             Res.insert(W);
  134.         }
  135.     }
  136. }
  137.  
  138. void WordsmaniaCheat(string &S) {
  139.     bool Used[16] = {0};
  140.     for (__int8 i(0); i != 16; ++i) {
  141.         if (Trie[0].child[S[i]] != 0) {
  142.             Used[i] = true;
  143.             WordsmaniaCheatBypass(Trie[0].child[S[i]], i, Used, S, S.substr(i, 1));
  144.             Used[i] = false;
  145.         }
  146.     }
  147. }
  148.  
  149. int main() {
  150.     Trie.push_back(NullNode);
  151.     LoadDictonary("Dictonary.txt");
  152.  
  153.     string Word;
  154.     char mode;
  155.  
  156.     while (true) {
  157.         cin >> mode;
  158.         switch (mode) {
  159.         case '1':
  160.             short L;
  161.             cin >> Word >> L;
  162.             EncodeString(Word, ConsoleSample);
  163.             GuessWord(Word, L);
  164.             break;
  165.         case '2':
  166.             cin >> Word;
  167.             EncodeString(Word, ConsoleSample);
  168.             WordsmaniaCheat(Word);
  169.             break;
  170.         }
  171.         cout << "==================" << endl;
  172.  
  173.         for (auto i(Res.begin()); i != Res.end(); ++i) {
  174.             Output.push_back(*i);
  175.         }
  176.         Res.clear();
  177.         if(mode == '2') sort(Output.begin(), Output.end(), cmp);
  178.         for (auto i(Output.begin()); i != Output.end(); ++i) {
  179.             for (auto j((*i).begin()); j != (*i).end(); ++j) {
  180.                 cout << ConsoleSample[*j];
  181.             }
  182.             cout << endl;
  183.         }
  184.         cout << "==================" << endl << endl;
  185.         Output.clear();
  186.     }
  187.  
  188.     return 0;
  189. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement