「BalticOI 2014 Day 1」三个朋友【字符串哈希】
题目描述
本题译自 BalticOI 2014 Day1 T2「Three Friends」
给定一个字符串 ,先将字符串 复制一次(变成双倍快乐),得到字符串 ,然后在 中插入一个字符,得到字符串 。
给出字符串 ,重新构造出字符串 。
所有字符串只包含大写英文字母。
输入格式
第一行一个整数 ,表示字符串 的长度。
第二行一个长度为 的字符串,表示字符串 。
输出格式
一行一个字符串,表示字符串 。
特别地:
如果字符串无法按照上述方法构造出来,输出 NOT POSSIBLE;
如果字符串 不唯一,输出 NOT UNIQUE。
样例
样例输入 1
7
ABXCABC
样例输出 1
ABC
样例输入 2
6
ABCDEF
样例输出 2
NOT POSSIBLE
样例输入 3
9
ABABABABA
样例输出 3
NOT UNIQUE
分析:显然字符串哈希,这题主要是想考对哈希的理解。
字符串删了一个字符,哈希值会怎么改变?
如S=“ABCD”,S’=“ABD”
S的哈希值=1×b3+2×b2+3×b1+4
S’的哈希值=1×b2+2×b1+4
就是C后面的哈希值不变,前面的哈希值会根据后面的长度进行改变,可以多造几个例子加深理解
那么这题就A了。
但是判重很麻烦,我省力直接用的mapA了,但是时间多了个log。后面我觉得可以在最后统计一下答案,别忘了字符串可以直接比较的,这样时间更快。
但我太弱了还懒qaq
#include<cstring>
#include<bits/stdc++.h>
#define ULL unsigned long long
using namespace std;
ULL Hash,hash[2000010];
ULL b=11;
ULL power[2000010];
char A[2000010];
int sum,ans;
map<int,bool> flag;
int main()
{
int l;
power[0]=1;
for(int i=1;i<=2e6;i++)
power[i]=power[i-1]*b;
scanf("%d",&l);
scanf("%s",A);
if(l%2==0)
{
printf("NOT POSSIBLE");
return 0;
}
{
for(int i=0;i<l;i++)
{
hash[i+1]=hash[i]*b+(ULL)(A[i]-'A'+1);
}
for(int i=1;i<=(l>>1);i++)
{
if(hash[(l>>1)+1]-hash[i]*power[(l>>1)+1-i]+hash[i-1]*power[(l>>1)-i+1]==hash[l]-hash[(l>>1)+1]*power[l>>1]&&flag[hash[l]-hash[(l>>1)+1]*power[l>>1]]==0)
sum++,ans=i,flag[hash[l]-hash[(l>>1)+1]*power[l>>1]]=1;
}
if(hash[l>>1]==hash[l]-hash[(l>>1)+1]*power[l>>1]&&flag[hash[l>>1]]==0)
sum++,ans=(l>>1)+1,flag[hash[l>>1]]=1;
for(int i=(l>>1)+2;i<=l;i++)
{
if(hash[l]-hash[i]*power[l-i]+(hash[i-1]-hash[(l>>1)]*power[i-1-(l>>1)])*power[l-i]==hash[l>>1]&&flag[hash[l>>1]]==0)
sum++,ans=i,flag[hash[l>>1]]=1;
}
if(sum==0) printf("NOT POSSIBLE");
else if(sum>=2) printf("NOT UNIQUE");
else
{
if(ans<=(l>>1)+1)
for(int i=(l>>1)+2;i<=l;i++)
printf("%c",A[i-1]);
else for(int i=0;i<(l>>1);i++)
printf("%c",A[i]);
}
}
return 0;
}
前面有段时间没学OI了,因为要出国了,但是发现好无聊啊文化课又学不懂英语菜死了就继续学了,还是OI好玩。以后继续写 qaq
谢谢
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构