专栏文章

?

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioz7pi9
此快照首次捕获于
2025/12/03 03:33
3 个月前
此快照最后确认于
2025/12/03 03:33
3 个月前
查看原文
CPP
#include <iostream>
#include <string>
#include <vector>
using namespace std;

// 检查字符串s是否可以通过插入字符变成t重复k次
bool canBeTransformed(const string& s, int d, int k) {
    int sLen = s.length();
    int tLen = d;
    int targetLen = d * k; // 插入后的长度
    
    // 确保targetLen >= sLen
    if (targetLen < sLen) {
        return false;
    }
    
    int sPos = 0; // s中的当前位置
    
    // 模拟构造t^k并匹配s
    for (int i = 0; i < targetLen; i++) {
        int tPos = i % tLen; // t中的位置
        
        // 如果s已经匹配完,剩余位置可以任意填充
        if (sPos >= sLen) {
            continue;
        }
        
        // 如果当前位置可以匹配s中的字符
        if (s[sPos] == ('a' + tPos)) {
            sPos++;
        }
    }
    
    // 如果s全部匹配成功
    return sPos == sLen;
}

int main() {
    int T;
    cin >> T;
    
    while (T--) {
        int n;
        string s;
        cin >> n >> s;
        
        int minLength = n; // 初始化为原长度
        
        // 遍历所有可能的d
        for (int d = 1; d <= n; d++) {
            // 计算最少需要重复的次数k
            int k = (n + d - 1) / d; // 向上取整
            
            // 检查是否存在t使得s可以变成t^k
            // 这里我们用t = "abcdefghijklmnopqrstuvwxyz"的前d个字符作为示例
            // 实际应该检查是否存在任意t满足条件
            // 优化:我们可以检查是否存在一个t,使得s是t^k的子序列
            if (canBeTransformed(s, d, k)) {
                minLength = min(minLength, d);
            }
        }
        
        cout << minLength << endl;
    }
    
    return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...