记字符串a和b的表示方式为:
a=a.prefix+a.suffix,a.prefix∩a.suffix=∅,a.suffix⫋a,a.prefix=∅ b=b.prefix+b.suffix,b.prefix∩b.suffix=∅,b.prefix⫋b,b.suffix=∅以上条件保证两字符串连接时不会出现包含情况, 其中有:
a.suffix=b.prefix若存在多组a.suffix和b.prefix满足该条件,则取长度最短的一组。
c++定义处理字符串连接函数如下:
ret merge(string a, string b) {
int len_a = a.length();
int len_b = b.length();
int len = min(len_a, len_b);
for(int i = 1; i < len; i++) {
string sub_a = a.substr(len_a - i, i);
string sub_b = b.substr(0, i);
if(sub_a == sub_b) {
string sub = b.substr(i, len_b - i);
return {i, sub};
}
}
return {0, ""};
}
返回数据结构:
typedef struct {
int len; //最小公共前后缀长度
string sub; //b.suffix,方便merge
}ret;
在dfs中进行字符串更新:
void dfs(string &a) {
if(a.length() > maxlen) {
maxlen = a.length();
}
for(int i = 0; i < n; i++) {
ret temp = merge(a, vec[i]);
if(used[i] and temp.len) {
used[i]--;
a.append(temp.sub);
dfs(a);
a.erase(a.length() - temp.sub.length(), temp.sub.length());
used[i]++;
}
}
return;
}