what is wrong, test #6, 1002
I've submitted 1002 43 times :( , with recursion and without
and cant find where is the error
___________________________________
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
const int MAX_SEQ_LEN = 100;
const int MAX_DW_LEN = 50;
struct Word
{
char* strWord;
char* numWord;
};
const int MAX_DICT_NUM = 50000;
struct WordArr
{
public:
typedef Word value_type;
typedef value_type* iterator;
WordArr(): lastWord(wordDict) {}
iterator begin() { return wordDict; }
iterator end() { return lastWord; }
void push_back(const value_type& w)
{
*lastWord = w;
lastWord++;
}
int size() const { return lastWord-wordDict; }
void reserve(int /*sz*/) {}
void clear() { lastWord = wordDict; }
value_type& operator[](int i) { return wordDict[i]; }
protected:
value_type wordDict[MAX_DICT_NUM]; // словарь
iterator lastWord;
};
typedef WordArr DictContainer;
//typedef vector<Word> DictContainer;
const int DATA_DICT_SIZE = 1000*1024 - MAX_DICT_NUM * sizeof(Word);
char dictBuf[DATA_DICT_SIZE]; // memory for dictionary strings
char* freePointer; //
char numSeq[MAX_SEQ_LEN+1]; // what to translate
int dictNum;
DictContainer wordDict; // dictionary
std::vector<int> resSeq; // result
bool isFound = false; //
char TransTable[26] =
{
'2', // a
'2', // b
'2', // c
'3', // d
'3', // e
'3', // f
'4', // g
'4', // h
'1', // i
'1', // j
'5', // k
'5', // l
'6', // m
'6', // n
'0', // o
'7', // p
'0', // q
'7', // r
'7', // s
'8', // t
'8', // u
'8', // v
'9', // w
'9', // x
'9', // y
'0', // z
};
//////////////////////////////////////////////////////////////////////////////////
// for Words
char* NewMem(int sz)
{
char* res = freePointer;
freePointer += sz;
return res;
}
void Clean()
{
wordDict.clear();
resSeq.clear();
isFound = false;
freePointer = dictBuf;
}
void TransWord(char* dest, char* src, int len)
{
for(int i=0; i<len; i++)
dest[i] = TransTable[src[i]-'a'];
}
void SetWord(Word& w, char* word, int len)
{
w.strWord = NewMem(len+1);
strcpy(w.strWord, word);
w.numWord = NewMem(len+1);
w.numWord[len] = 0;
TransWord(w.numWord, w.strWord, len);
}
void Input()
{
std::cin >> numSeq;
if( strcmp(numSeq, "-1" ) == 0 )
return; // end of work
std::cin >> dictNum;
char buf[MAX_DW_LEN+1];
Word word;
for(int i=0; i<dictNum; i++)
{
std::cin >> buf;
int len = strlen(buf);
SetWord(word, buf, len);
wordDict.push_back(word);
}
}
bool LessWordCompare(const Word& w1, const Word& w2)
{
return strcmp(w1.numWord, w2.numWord) < 0;
}
// for recursion
struct FindPack
{
DictContainer::iterator* beg;
DictContainer::iterator* end;
Word* cur_match;
std::vector<int>* cur_seq;
};
void FindNext(FindPack& pack)
{
Word& cur_match = *pack.cur_match;
if( *cur_match.numWord == 0 )
{
if( !isFound || (*pack.cur_seq).size() < resSeq.size() )
{
isFound = true;
resSeq = *pack.cur_seq;
}
return;
}
DictContainer::iterator upp_end = std::upper_bound(*pack.beg, *pack.end, *pack.cur_match, LessWordCompare);
int word_len = strlen(cur_match.numWord);
DictContainer::iterator cur_iter;
for(DictContainer::iterator cur_iter1 = upp_end; cur_iter1 != *pack.beg ; --cur_iter1)
{
cur_iter = cur_iter1-1;
Word& w = *cur_iter;
int len = strlen(w.numWord);
if( len > word_len ) break;
if( strncmp(w.numWord, cur_match.numWord, len) != 0 ) break;
cur_match.numWord += len;
(*pack.cur_seq).push_back(cur_iter - *pack.beg);
FindNext(pack);
cur_match.numWord -= len;
(*pack.cur_seq).pop_back();
}
}
void Work()
{
std::sort(wordDict.begin(), wordDict.end(), LessWordCompare);
Word cur_match;
cur_match.numWord = numSeq;
std::vector<int> cur_seq;
DictContainer::iterator beg = wordDict.begin();
DictContainer::iterator end = wordDict.end();
FindPack pack = { &beg, &end, &cur_match, &cur_seq };
FindNext(pack);
}
void Output()
{
if( !isFound )
{
std::cout << "No solution." << std::endl;
}
else
{
for(int i=0, cnt=resSeq.size(); i<cnt; i++)
std::cout << wordDict[resSeq[i]].strWord << " ";
std::cout << std::endl;
}
}
int main(int /*argc*/, char * /*argv*/ [])
{
for(;;)
{
Clean();
Input();
if( strcmp(numSeq, "-1" ) == 0 )
break;
Work();
Output();
}
return 0;
}