『题解』Luogu P8846 『JROI-7』PMK 配匹串符字

题目传送门

题目大意

对于一个字符串 \(S\),记 \(|S|\)\(S\) 的长度,\(S_i\)\(S\) 的第 \(i\) 个字符,\(S_{l,r}\)\(S_l,S_{l+1},\dots,S_r\) 组成的字串。定义两个字符串相等,当且仅当他们长度相等,且每个位置的字符相同。

对于一个字符串 \(S\) 和一个正整数 \(i\le |S|\),若 \(k\) 是满足 \(k<i\)\(S_{1,k}=S_{i-k+1,i}\) 的最大的正整数,则 \(next_i=k\)。特别的,若不存在 \(k\) 满足条件,则 \(next_i=0\)

请构造一个由小写字母组成的字符串 \(S\),满足 \(|S|=n\),且对于所有正整数 \(i\le |S|\)\(next_i\) 之和最小。

思路

显然,题目中的 \(k\) 就是子串 \(S_{1,i}\) 的最长相同前后缀的长度。

于是我们思考如何使得相同前后缀长度最短。容易发现,当字符串的第一位与最后一位不同时,则没有 \(k\) 满足条件。由于字符串的第一位不变,所以我们就让 \(S_{2,|S|}\) 都与 \(S_1\) 不同即可。

第一个字符可以随便选,后面的也可以,只要不与第一个相同即可。

代码

#include <iostream>
using namespace std;
int n;

int main(){
    scanf("%d",&n);
    putchar('a'),n--;
    while(n--) putchar('k');
    puts("");
    return 0;
}
posted @ 2022-11-15 12:38  仙山有茗  阅读(42)  评论(0)    收藏  举报