P11276 第一首歌 题解
1.[ABC347C] Ideal Holidays题解2.《扶苏的问题》题解3.[ABC366C] Balls and Bag Query 题解4.[ABC366D] Cuboid Sum Query 题解5.P7706 文文的摄影布置 题解6.[ABC370C] Word Ladder 题解7.P11020 「LAOI-6」Radiation 题解8.P11019 「LAOI-6」[太阳]] 请使用最新版手机 QQ 体验新功能 题解9.[ABC371D] 1D Country 题解10.[ABC371D] 1D Country 线段树解法11.P1955 程序自动分析 题解12.[ABC376E] Max × Sum 题解13.[ABC379D] Home Garden 题解
14.P11276 第一首歌 题解
15.[ABC380C] Move Segment 题解P11276 第一首歌 题解
一道简单的字符串题目。
题目解释
说求一个最短的字符串
-
为 的前缀。 -
为 的后缀。 -
不为 。
仔细思考一下,则易得
考虑非特殊情况,那么也就是删去第二个累加的
解题思路
观察到要求相同的前缀和后缀,正好在学 KMP 于是这里使用了其前缀数组解决。那么问题便简化了,求出的
code
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6+10;
string s1;
int net[maxn];
void build_kmp(string s){
net[0]=0,net[1]=0;
int len=0,i=1;
for(int i=1;i<s.size();i++){
int j=net[i];
while(j&&s[i]!=s[j]){
j=net[j];
}
if(s[i]==s[j]) net[i+1]=j+1;
else net[i+1]=0;
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>s1;
build_kmp(s1);
cout<<s1; //第一遍无需修改
for(int i=net[(int)s1.size()];i<(int)s1.size();i++){
cout<<s1[i]; //输出非重复部分
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】