|
|
вернуться в форумОбщий форумI can!!! Послано Martin 25 авг 2004 21:49 #include <stdlib.h> #include <iostream> #include <string> using namespace std; /** * 1 ij 2 abc 3 def * 4 gh 5 kl 6 mn * 7 prs 8 tuv 9 wxy * 0 oqz */ char* table = "22233344115566070778889990"; //abcdefghijklmnopqrstuvwxyz int cnt; string number; string *dict; int mas[100][100]; int vect[100]; bool was[100]; int vlen = 0; int tries = 0; int tmpval = 256; void process(int num); void solve(); int q(int leng,int deep); int main() { while (true) { cin >> number; if (number == "-1") return 0; cin >> cnt; dict = new string[cnt]; memset(mas, 0, sizeof(mas)); for (int i=0; i<cnt; i++) { cin >> dict[i]; process(i); } solve(); delete[] dict; } return 0; } void process(int num) { string tmp = dict[num]; for (int i=0; i< dict[num].length(); i++) { tmp[i] = table[dict[num][i] - 'a']; } int i2 = tmp.length(); int i1 = number.find(tmp, 0); while(i1 != -1) { mas[i1][i1+tmp.length()-1] = num+1; i1 = number.find(tmp, i1+1); } } void solve() { memset(vect, 0, sizeof(vect)); memset(was, 0, sizeof(was)); int a = number.length(); tmpval = 256; vlen = q(a-1, 0); if (vlen <= 101) { for (int i=0; i< vlen; i++) cout << dict[vect[i]] << ' '; } else { cout << "No solution."; } cout << "\n"; } int q(int leng, int deep) { int retval = 256; int tmp = 0; // temporary value; if (was[leng]) return 257; if ((deep >= tmpval)) { return 257; } if (mas[0][leng] != 0) { tmp = 0; vect[0] = mas[0][leng]-1; tmpval = deep; was[leng] = true; return 1; } for (int i=1; i<=leng; i++) { if (mas[i][leng] != 0) { int a = q(i-1, deep+1); if (a < retval) retval = a, tmp = i; } } if (retval <= 101) { q(tmp-1, deep+1); vect[retval] = mas[tmp][leng]-1; was[leng] = true; } return retval+1; } |
|
|