intwork(){ ans = s[0]; for (int i = 1; i < n; i ++ ) { int st = min(ans.size(), s[i].size()); // 从两个字符串的长度较短的那个开始 for (int j = st; j >= 0; j -- ) { // 枚举一遍 if (ans.substr(ans.size() - j, j) == s[i].substr(0, j)) { // 判断是否可以拼接 ans += s[i].substr(j, s[i].size() - j); break; } } } return ans.size(); // 返回长度(即当前情况下的答案) }
signedmain(){ scanf("%d", &T); for (int i = 1; i <= T; i ++ ) { scanf("%d", &n); for (int i = 0; i < n; i ++ ) cin >> s[i]; res = inf; // 每次先初始化为最大值,然后再一点点缩减 sort(s, s + n); // 从“字典序”最小的开始 //这样之后经过“全排列”操作就可以把所有的情况都计算上 do res = min(res, work()); while (next_permutation(s, s + n)); // 对所有的“排列”(即所有情况)进行计算 // 并且取最小值 printf("Case %d: %d\n", i, res); } return0; }