洛谷P018 乘积最大 2000年NOIP真题
解题思路:
本题可以用过dfs搜索出来结果,但需要注意搜索的终止条件,那就是所有的单词最多使用两次,而每两个单词之间可以连接的要求是第一个单词不是第二个单词的前缀,或者第二个单词不是第一个单词的后缀,第一个单词的的尾部的子串等于第二个单词头部的子串。两个单词连接后,将消去中间的公共部分,而公共部分可以尽可能的选取短一点。
举例如下:
"abc"和"bcd"拼接后的字符串为:“abcd”
"abcc"和"ccd"拼接后的字符串为:“abccd”
"abbb"和"bbbbd"拼接后的字符串为:“abbbbbbd”
"abc"和"dd"不能拼接
"ab"和"abc"不能拼接
"abc"和"bc"不能拼接
"ab"和"cd"不能拼接
AC代码:
//
// Created by jal on 18-9-18.
//
#include <bits/stdc++.h>
using namespace std;
int len = 0;
map<string, vector<string> > m;
vector<string> v;
string get_substr(string s, int left, int right) {
string ret(right - left + 1, '0');
for (int i = left; i <= right; i++) {
ret[i - left] = s[i];
}
return ret;
}
map<string, int> vis;
pair<int, string> add_len(string s1, string s2) {
if (s1.size() == 1 || s2.size