1 条题解

  • 0
    @ 2026-1-30 16:09:02
    #include<bits/stdc++.h>
    using namespace std;
    string s;  // 存储输入的最终项链字符串
    
    int main() {
        cin >> s;  // 输入最终的项链字符串
        int n = s.size();  // n:当前项链的长度
    
        // [1] 倒推循环:当当前长度为偶数时,尝试拆分出更短的原始项链
        while(n % 2 == 0) {
            string s_1 = "", s_2 = "", s_3 = "";
            // 提取前半部分字符串
            for(int i = 0; i < n / 2; i++) {
                s_1 += s[i];
            }
            // 提取后半部分字符串
            for(int i = n / 2; i < n; i++) {
                s_2 += s[i];
            }
            // 生成后半部分的逆序字符串(模拟魔镜增加的反转部分)
            for(int i = n - 1; i >= n / 2; i--) {
                s_3 += s[i];
            }
    
            // [2] 判断当前字符串是否可由更短字符串通过魔镜生成
            // 条件1:前半 == 后半(对应魔镜操作中t的反转等于t的情况)
            // 条件2:前半 == 后半的逆序(对应魔镜操作t + reverse(t))
            if(s_1 == s_2 || s_1 == s_3) {
                s = s_1;  // 缩小为前半部分,作为新的当前项链
                n = s.size();  // 更新当前项链长度
            } else {
                break;  // 无法继续拆分,退出循环
            }
        }
    
        // [3] 输出倒推得到的最小初始项链长度
        cout << n;
        return 0;
    }
    
    • 1

    信息

    ID
    1211
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    递交数
    2
    已通过
    1
    上传者