『题解』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;
}

浙公网安备 33010602011771号