func_code_string: #include <bits/stdc++.h>   int Set(int N, int pos) { return N = N | (1 << pos); }   int reSet(int N, int pos) { return N = N & ~(1 << pos); }   bool check(int N, int pos) { return (bool)(N & (1 << pos)); }   using namespace std;   string s;   int n;   bool dp[10010][4], taken[10010][4];   bool isSafe(int pos, int l1) {     if (pos - l1 < 0) return true;     for (int i = 0; i < l1; i++) {       if (s[pos + i] != s[pos - l1 + i]) return true;     }     return false;   }   bool go(int pos, int pre) {     if (pos > n) return false;     if (pos == n) return dp[pos][pre] = true;     if (taken[pos][pre]) return dp[pos][pre];     taken[pos][pre] = true;     bool ret = false;     if (pre == 3) {       ret |= go(pos + 2, 2);       if (isSafe(pos, 3)) ret |= go(pos + 3, 3);     }     if (pre == 2) {       ret |= go(pos + 3, 3);       if (isSafe(pos, 2)) ret |= go(pos + 2, 2);     }     if (pre == 1) {       ret |= go(pos + 1, 1);       ret |= go(pos + 2, 2);       ret |= go(pos + 3, 3);     }     return dp[pos][pre] = ret;   }   set<string> S;   void get_solution(int pos, int pre) {     if (pos > n || taken[pos][pre]) return;     taken[pos][pre] = true;     string res;     if (pre == 1) {       if (dp[pos + 1][1]) get_solution(pos + 1, 1);       if (dp[pos + 2][2]) {         res = s.substr(pos, 2);         S.insert(res);         get_solution(pos + 2, 2);       }       if (dp[pos + 3][3]) {         res = s.substr(pos, 3);         S.insert(res);         get_solution(pos + 3, 3);       }     }     if (pre == 2) {       if (dp[pos + 2][2]) {         res = s.substr(pos, 2);         S.insert(res);         get_solution(pos + 2, 2);       }       if (dp[pos + 3][3]) {         res = s.substr(pos, 3);         S.insert(res);         get_solution(pos + 3, 3);       }     }     if (pre == 3) {       if (dp[pos + 2][2]) {         res = s.substr(pos, 2);         S.insert(res);         get_solution(pos + 2, 2);       }       if (dp[pos + 3][3]) {         res = s.substr(pos, 3);         S.insert(res);         get_solution(pos + 3, 3);       }     }   }   int main() {     int tc, t = 1;     while (cin >> s) {       n = s.size();       memset(taken, false, sizeof taken);       if (go(5, 1)) {         memset(taken, false, sizeof taken);         get_solution(5, 1);       }       for (int i = 0; i < n + 1; i++) {         for (int j = 1; j < 4; j++) {         }       }       set<string>::iterator it;       cout << S.size() << endl;       for (it = S.begin(); it != S.end(); it++) {         cout << *it << endl;       }       S.clear();     }     return 0;   }   