friends #2823. 「BalticOI 2014 Day 1」三个朋友
[BalticOI 2014 Day1] Three Friends
题目描述
有一个字符串
- 将
复制为两份,存在字符串 中 - 在
的某一位置上插入一个字符,得到字符串
现在给定
输入格式
第一行一个整数
第二行
输出格式
- 如果不能通过上述的步骤从
推到 ,输出NOT POSSIBLE
。 - 如果从
得到的 不是唯一的,输出NOT UNIQUE
。 - 否则,输出一个字符串
。
样例 #1
样例输入 #1
7
ABXCABC
样例输出 #1
ABC
样例 #2
样例输入 #2
6
ABCDEF
样例输出 #2
NOT POSSIBLE
样例 #3
样例输入 #3
9
ABABABABA
样例输出 #3
NOT UNIQUE
提示
数据规模与约定
本题采用捆绑测试。
- Subtask 1(35 pts):
。 - Subtask 2(65 pts):无特殊限制。
对于
说明
翻译自 BalticOI 2014 Day1 B Three Friends。
思路
这题是一体经典的字符串哈希题,我们可以先求出每个字符串得哈希值,但是这题有些字符串有多余字符,因为每一个哈希值都是
代码
#include <iostream>
using namespace std;
typedef unsigned long long ULL;
const int N = 2000010,BASE = 131;
int n;
char s[N];
ULL h[N],p[N];
void string_hash_prework () {
p[0] = 1;
for (int i = 1;i <= n;i++) {
h[i] = h[i-1] * BASE + (s[i] - 'A' + 1);
p[i] = p[i-1] * BASE;
}
}
ULL query (int l,int r) {
return h[r]-h[l-1]*p[r-l+1];
}
int main () {
scanf ("%d%s",&n,s+1);
if ((n & 1) == 0) printf ("NOT POSSIBLE");
else {
string_hash_prework ();
int t = 0;
ULL ans = 0;
bool flag = false;
for (int i = 1;i <= n;i++) {
ULL h1,h2;
if (i <= n/2) h1 = query (1,i-1)*p[n/2-i+1]+query (i+1,n/2+1);
else h1 = query (1,n/2);
if (i <= n/2+1) h2 = query (n/2+2,n);
else h2 = query (n/2+1,i-1)*p[n-i]+query (i+1,n);
if (h1 == h2) {
if (flag && ans != h1) {
printf ("NOT UNIQUE");
return 0;
}
flag = true;
ans = h1,t = i;
}
}
if (!flag) printf ("NOT POSSIBLE");
else {
int cnt = 1;
for (int i = 1;cnt <= n/2;i++) {
if (i != t) {
printf ("%c",s[i]);
cnt++;
}
}
}
printf ("\n");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现