Advertisement
Guest User

Untitled

a guest
May 29th, 2016
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. /****************************************
  2. **     Solution by Bekzhan Kassenov    **
  3. ****************************************/
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7. using namespace std;
  8.  
  9. #define F first
  10. #define S second
  11. #define MP make_pair
  12. #define all(x) (x).begin(), (x).end()
  13.  
  14. typedef long long ll;
  15. typedef unsigned long long ull;
  16. typedef long double ld;
  17.  
  18. const double EPS = 1e-9;
  19. const double PI = acos(-1.0);
  20. const int MOD = 1000 * 1000 * 1000 + 7;
  21. const int INF = 2000 * 1000 * 1000;
  22. const int MAXN = 110;
  23.  
  24. template <typename T>
  25. inline T sqr(T n) {
  26.     return n * n;
  27. }
  28.  
  29. struct Node {
  30.     int next[26];
  31.     bool used;
  32.  
  33.     void init() {
  34.         memset(next, 0, sizeof next);
  35.         used = false;
  36.     }
  37. };
  38.  
  39. Node node[100 * 100];
  40. int last;
  41.  
  42. int T;
  43. char s[MAXN];
  44. int n, k;
  45.  
  46. void add(char s[]) {
  47.     int cur = 0;
  48.     for (int i = 0; s[i]; i++) {
  49.         int let = s[i] - 'a';
  50.         if (node[cur].next[let] == 0) {
  51.             node[cur].next[let] = last;
  52.             node[last].init();
  53.             last++;
  54.         }
  55.  
  56.         cur = node[cur].next[let];
  57.     }
  58. }
  59.  
  60. vector <int> len;
  61.  
  62. bool go(int pos, int num) {
  63.     bool ans = false;
  64.  
  65.     if (num == k - 1) {
  66.         if (pos == n) {
  67.             return ans = false;
  68.         }
  69.  
  70.         int cur = 0;
  71.         for (int i = pos; i < n; i++) {
  72.             int let = s[i] - 'a';
  73.             cur = node[cur].next[let];
  74.         }
  75.  
  76.         if (node[cur].used) {
  77.             return ans = false;
  78.         }
  79.  
  80.         len.push_back(n - pos);
  81.         return ans = true;
  82.     }
  83.  
  84.     int cur = 0;
  85.     for (int i = pos; i < n; i++) {
  86.         int let = s[i] - 'a';
  87.         cur = node[cur].next[let];
  88.  
  89.         if (!node[cur].used) {
  90.             node[cur].used = true;
  91.             len.push_back(i - pos + 1);
  92.  
  93.             if (go(i + 1, num + 1)) {
  94.                 return ans = true;
  95.             }
  96.  
  97.             len.pop_back();
  98.             node[cur].used = false;
  99.         }
  100.     }
  101.  
  102.     return ans = false;
  103. }
  104.  
  105. int main() {
  106. #ifdef Local
  107.     freopen("in", "r", stdin);
  108. #endif
  109.  
  110.     scanf("%d\n", &T);
  111.  
  112.     while (T--) {
  113.         gets(s);
  114.         n = strlen(s);
  115.  
  116.         scanf("%d\n", &k);
  117.  
  118.         last = 1;
  119.         node[0].init();
  120.  
  121.         for (int i = 0; i < n; i++) {
  122.             add(s + i);
  123.         }
  124.  
  125.         len.clear();
  126.  
  127.         if (!go(0, 0)) {
  128.             puts("NO");
  129.         } else {
  130.             puts("YES");
  131.  
  132.             int pos = 0;
  133.             for (int i = 0; i < k; i++) {
  134.                 char buf = s[pos + len[i]];
  135.                 s[pos + len[i]] = '\0';
  136.                
  137.                 puts(s + pos);
  138.                
  139.                 s[pos + len[i]] = buf;
  140.                 pos += len[i];
  141.             }
  142.         }
  143.     }
  144.    
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement