C++ || BACKTRACKING || BITMASKING
Since ther number of letters are all lower case i.e. only 26 letters, we can mask these letters with the help of an integer and find out if there is any letter 
Since ther number of letters are all lower case i.e. only 26 letters, we can mask these letters with the help of an integer and find out if there is any letter in the string which is being previously used. If the answer is true we will not use that string and look for another string.\n\n\n```\nclass Solution {\npublic:\n\n    int ans = 0;\n    //valid finds out if the letters in the current string are used before or not \n    bool valid(int &mask, string s)\n\t{\n        for(auto x: s)\n\t\t{\n\t\t\t//if we find ther letter is being used we will return false\n            if(mask&(1<<(x - \'a\'))) return false;\n\t\t\t//since we are using call by refrece for mask we are simultaneously calculating the new mask\n            mask=mask|(1<<(x-\'a\'));\n        }\n        return true;\n    }\n    \n    void rec(vector<string>& arr, int idx, int mask, int length)\n\t{\n\t\t//checking if we have encountered a larger string\n        ans = max(length, ans);\n\t\t\n        if(idx >= arr.size()) return;\n\t\t\n        for(int i = idx; i < arr.size(); i++)\n\t\t{\n            int nmask = mask;\n\t\t\t//if the string is a valid string we will use that string and calculate further\n            if(valid(nmask, arr[i]))\n\t\t\t{\n                rec(arr, i+1, nmask, length+arr[i].size());\n\t\t\t}\n        }\n    }\n    int maxLength(vector<string>& arr) {\n        rec(arr, 0, 0, 0);\n        return ans;\n    }\n};\n```
['Backtracking', 'Bit Manipulation', 'C', 'Bitmask']