CH1807 Necklace (字符串Hash + 最小表示法)
把第一个字符串拼接后就是hash + 最小表示法板子了。
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=4000010,P=131;
string s, t, ss;
typedef unsigned long long ULL;
ULL h1[N], p1[N], h2[N], p2[N];
int lens, lent;
ULL get1(int l,int r)
{
return h1[r] - h1[l-1] * p1[r-l+1];
}
ULL get2(int l,int r)
{
return h2[r] - h2[l-1] * p2[r-l+1];
}
long long ans = 0;
int main()
{
//freopen("data.txt", "r", stdin);
cin >> s;
cin >> t;
ss = s;
s = s + ss;
lens = s.size(), lent = t.size();
s = " " + s;
t = " " + t;
p1[0] = 1;
p2[0] = 1;
for(int i = 1; i <= lens; i++)
{
p1[i] = p1[i-1] * P;
h1[i] = h1[i-1] * P +s[i];
}
for(int i = 1;i <= lent; i++)
{
p2[i] = p2[i-1] * P;
h2[i] = h2[i-1] * P +t[i];
}
bool flag = 0;
for(int i = 1; i + lent <= lens; i++)
{
if(get1(i, i + lent - 1) == get2(1, lent))
{
flag = 1;
break;
}
}
if(flag) cout << "Yes" << endl;
else {
cout << "No" << endl;
return 0;
}
int i = 1, j = 2, k;
while(i <= lent && j <= lent) {
for(k = 0; k < lent && s[i + k] == s[j + k]; k++);
if(k == lent) break;
if(s[i + k] > s[j + k]) {
i = i + k + 1;
if(i == j) i++;
} else {
j = j + k + 1;
if(i == j) j++;
}
}
int ans = min(i, j);
for(int i = ans; i <= ans + lent - 1; i++) {
cout << s[i];
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2020-03-05 P1403 [AHOI2005]约数研究(筛法)
2020-03-05 P1029 最大公约数和最小公倍数问题(数论水题)
2020-03-05 洛谷P1147连续自然数和(前缀和)