CCCPaste

Untitled

#include 
#include 
#include 
#include 
#include 
#include 
#include 
//#include 
using namespace std;
vectors;
int n;

vector > words[1005];
vector > words_cnt[1006];
int dp[10005];
bool compare_two_strings(string &A, string &B) {

  return true;
}


int backtrack[10005];

int dinamicko(int i){
if(i==n){
    backtrack[i] = -1;
    return 0;
}
    if(dp[i] != -1) {
        return dp[i];
    }
int result=-1;
    int next_index = -1;
    vector cntA(26, 0);



   for(int j = 0; j < s[i].size(); j++) {
        cntA[s[i][j] - 'A']++;
    }
    
    
    int k = s[i].size();
    
    for(int j = 0; j < words[k + 1].size(); j++) {
        vector cntB = words_cnt[k + 1][j];
        bool ok = true, flag = false;
        for(int l = 0; l < 26; l++) {
            if(abs(cntA[l] - cntB[l]) == 0) continue;
            if(abs(cntA[l] - cntB[l]) == 1 and  !flag) {
                flag = true;
                continue;
            }
            if(abs(cntA[l] - cntB[l]) >= 1 or flag) {
                ok = false;
                break;
            }
        }
        if(!ok) continue;
            int tmp = dinamicko(words[k + 1][j].second) + 1;
            if(tmp > result) {
                result = tmp;
                next_index = words[k + 1][j].second;
            }
        
    }
    if(next_index != -1)
        backtrack[i] = next_index;


    return dp[i] = result;
}
int main()
{
    ios_base::sync_with_stdio(false);
    ifstream cin("input.txt");
    memset(dp, -1, sizeof dp);
cin>>n;

for(int i=0; i>a;
//    sort(a.begin(), a.end());
    s.push_back(a);
    vector alpha(26, 0);
    for(int j = 0; j < a.size(); j++) {
        alpha[a[j] - 'A']++;
    }
    words[(int) a.size()].push_back(make_pair(a, i));
    words_cnt[(int) a.size()].push_back(alpha);
}
    
//    sort(s.begin(), s.end());
    memset(backtrack, -1, sizeof backtrack);
    int result = -1;
    int START = 0;
    for(int i = 0; i < n; i++) {
        int tmp =  dinamicko(i) ;
        
        if(result < tmp and s[i].size() <= 2) {
            result = tmp;
            START = i;
        }
    }
    cout << result << endl;
//    cout << s[START] << endl;
//    if(result <= 1) {
//        cout << 1 << endl;
//        cout << s[0][0] << endl;
//        return 0;
//    }
//    set st;
    string p = "";
    p += s[START][0];
    vector ret;
    ret.push_back(p);
    if(s[START].size() == 1) {
        ret.erase(ret.begin());
    }
//    st.insert(p);
    while(START != -1) {
//        st.insert(s[START]);
        ret.push_back(s[START]);
        START = backtrack[START];
    }
//    cout << START << endl;
//    cout << s[START] << endl;
    if(ret[0].size() != ret[1].size() - 1) {
        cout << 1  << "\nA";
        return 0;
    }
    cout << ret.size() << endl;
    
    for(string x : ret) {
        cout << x << "\n";
    }
    return 0;
}