关于题意理解和代码生成
查看原帖
关于题意理解和代码生成
590283
lunatics楼主2024/6/27 17:22

记字符串a和b的表示方式为:

a=a.prefix+a.suffix,a.prefix∩a.suffix=∅,a.suffix⫋a,a.prefix≠∅\begin{aligned} a = a.prefix + a.suffix &,\qquad a.prefix \cap a.suffix = \emptyset\\ &,\qquad a.suffix \subsetneqq a\\ &,\qquad a.prefix \ne \emptyset\\ \end{aligned} b=b.prefix+b.suffix,b.prefix∩b.suffix=∅,b.prefix⫋b,b.suffix≠∅\begin{aligned} b = b.prefix + b.suffix &,\qquad b.prefix \cap b.suffix = \emptyset\\ &,\qquad b.prefix \subsetneqq b\\ &,\qquad b.suffix \ne \emptyset\\ \end{aligned}

以上条件保证两字符串连接时不会出现包含情况, 其中有:

a.suffix=b.prefixa.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;
}
2024/6/27 17:22
加载中...