专栏文章

10.15 晚上考试总结

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

文章操作

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

当前评论
0 条
当前快照
1 份
快照标识符
@minlkf3q
此快照首次捕获于
2025/12/02 04:23
3 个月前
此快照最后确认于
2025/12/02 04:23
3 个月前
查看原文
题目编号分数
T10
T2100
T3100
T410

So we only need to write the summary for T1

T1 P13867

考场写得都差不多了,但是在哈希维护的时候脑子抽了,怎么想都想不通,考完试听完后又会了,主要思路就是二分答案

正解代码

CPP
#include <bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int N=1e6+5;
const int p=13331;
int pw[N],hs[N];
int lens;
int get_hash(int l,int r)
{
	return hs[r]-hs[l-1]*pw[r-l+1];
}
map<int,int> v;
bool check(int x)
{
	v.clear();
	for(int i=1;i<=lens-x+1;i++)v[get_hash(i,i+x-1)]++;
	for(int i=1;i<=lens-x+1;i++)
	{
		if(v[get_hash(i,i+x-1)]==1)return 1;//就是这里
	}
	return 0;
}
signed main()
{
	string s;
	cin>>s;
	lens=s.size();
	s='#'+s;
	pw[0]=1;
	for(int i=1;i<=lens;i++)
	{
		hs[i]=hs[i-1]*p+(s[i]-'0');
		pw[i]=pw[i-1]*p;
	}
	int l=1,r=lens;
	while(l<r)
	{
		int mid=(l+r)/2;
		if(check(mid))r=mid;
		else l=mid+1;
	}
	v.clear();
	for(int i=1;i<=lens-l+1;i++)v[get_hash(i,i+l-1)]++;
	for(int i=1;i<=lens-l+1;i++)
	{
		if(v[get_hash(i,i+l-1)]==1)
		{
			cout<<s.substr(i,l);
			return 0;
		}
	}
	return 0;
}

评论

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

正在加载评论...