【来源】:bzoj3916

【参考博客】

BZOJ3916: [Baltic2014]friends

【 哈希和哈希表】Three Friends

【Baltic2014】【BZOJ3916】friends


【题解】

首先hash整个串,然后分成三种情况,分别是前半段,中间,后半段,三段的字母试图去掉看能否拼起来。

如果可以,那么还需要考虑是否为唯一的。

唯一的意思是: 串S,如果有选择两个不同的串S也能构成这个原串。

代码还是参考别人写的。

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; const int N = 2e6+;
typedef unsigned long long ull ;
const ull base = ; ull Pow[N],Hash[N];
ull Lstr , Rstr , S;
char str[N],Ans[N];
int n,Mid,pos=-; // NOT POSSIBLE = Odd or Not found a S
// NOT UNIQUE = exist least two S
// Else = The answer S // 切割字符串返回hash值
ull Cut_str( int L ,int R ){
ull ans = Hash[R] - Hash[L-] * Pow[R-L+] ;
return ans ;
} bool check (int i){
//如果未被标记过,则标记 返回true
//如果标记过,同时这个字符串和暂存的串不一样则返回false
if( pos == - || S == Lstr ){
pos = i ;
S = Lstr ;
return true ;
}else{
return false ;
}
}
int main()
{
scanf("%d%s",&n,str+);
Mid = n >> ; //偶数情况下无法构成
if( n%== ) return puts("NOT POSSIBLE"),; Pow[] = ;
for(int i=;i<=n;i++){
Pow[i] = Pow[i-] * base ;
Hash[i] = Hash[i-] * base + (ull)(str[i]-'A'+);
//所有字符串只包含大写英文字母
} // delete one character in [1,Mid]
for(int i= ; i<=Mid ; i++ ){
Lstr = Cut_str(,i-) * Pow[Mid+-i] + Cut_str(i+,Mid+);
Rstr = Cut_str(Mid+,n);
if( Lstr == Rstr ) if( !check(i) ) return puts("NOT UNIQUE"),;
} // delete Mid + 1
Lstr = Hash[Mid] ;
Rstr = Hash[n] - Hash[Mid+] * Pow[Mid];
if( Lstr == Rstr ) if( !check(Mid+) ) return puts("NOT UNIQUE"),; // delete [Mid+2,n] for(int i=Mid+ ; i<=n; i++ ){
Lstr = Hash[Mid];
Rstr = Cut_str(Mid+,i-) * Pow[n-i] + Cut_str(i+,n);
if( Lstr == Rstr ) if( !check(i) ) return puts("NOT UNIQUE"),;
} if( pos == - ){
return puts("NOT POSSIBLE"),;
} int len = n/,cnt = ;
for(int i=; i<=n && len ; i++ ){
if( pos == i ) continue;
Ans[cnt++] = str[i] ;
len -- ;
}
Ans[cnt] = '\0';
printf("%s\n",Ans);
return ;
} /* 7
ABXCABC */

【hash】Three friends的更多相关文章

  1. 【hash】BZOJ3751-[NOIP2014]解方程

    [题目大意] 已知多项式方程:a0+a1*x+a2*x^2+...+an*x^n=0.求这个方程在[1,m]内的整数解(n和m均为正整数). [思路] *当年考场上怒打300+行高精度,然而没骗到多少 ...

  2. 【hash】Power Strings

    [题意]: 给出s串出来,能否找到一个前缀 ,通过多次前缀进行拼接.构成s串.如果有多个,请输出最多次数那个. 如:aaaa 可以用1个a,进行4次拼接 可以用2个a,进行2次拼接 可以用4个a,进行 ...

  3. 【hash】Similarity of Subtrees

    图片来源: https://blog.csdn.net/dylan_frank/article/details/78177368 [题意]: 对于每一个节点来说有多少对相同的子树. [题解]: 利用层 ...

  4. 【hash】Seek the Name, Seek the Fame

    [哈希和哈希表]Seek the Name, Seek the Fame 题目描述 The little cat is so famous, that many couples tramp over ...

  5. 【hash】A Horrible Poem

    [题目链接] # 10038. 「一本通 2.1 练习 4」A Horrible Poem [参考博客] A Horrible Poem (字符串hash+数论) [题目描述] 给出一个由小写英文字母 ...

  6. 湖南师范大学2018年大学生程序设计竞赛新生赛 A 齐神和心美的游戏【hash】

    [链接]:A [题意]:给你n个数的序列和k.判断是否可以三个数组成k(同一个数可以拿多次) [分析]:每个数vis记录一下.2层循环.两数之和不超过k以及剩下的数出现在序列中那么ok. [代码]: ...

  7. 【hash】珍珠

    [来源] https://loj.ac/problem/2427 [参考博客] LOJ#2427. 「POI2010」珍珠项链 Beads [题解]: 复杂度计算: 暴力枚举k每次计算是n/2+n/3 ...

  8. 洛谷P1117 优秀的拆分【Hash】【字符串】【二分】【好难不会】

    题目描述 如果一个字符串可以被拆分为AABBAABB的形式,其中 A和 B是任意非空字符串,则我们称该字符串的这种拆分是优秀的. 例如,对于字符串aabaabaaaabaabaa,如果令 A=aabA ...

  9. hdu 5183 Negative and Positive (NP)(STL-集合【HASH】)

    题意: When given an array (a0,a1,a2,⋯an−1) and an integer K, you are expected to judge whether there i ...

随机推荐

  1. input输入框只能输入数字和英文逗号

    <input type="text"  onkeyup="this.value=this.value.replace(/[^\d\,]/g,'')"> ...

  2. CodeForces Good Bye 2016

    A题,水题略过. B题,也水,但是想复杂了.只要运动超出[0,20000]的范围就算不可能了. C题,我自己的方法是解不等式,然后取最大的答案即可.代码如下: #include <stdio.h ...

  3. 两个int值相乘超过int最大值

    System.out.println(100000000*1000 ); //输出结果是:1215752192 先将100000000*1000 的结果转化为二进制: 10111 01001000 0 ...

  4. 预处理、const、static与sizeof-C++中const有什么作用(至少说出3个)

    1:作用如下: (1)const用于定义常量:const定义的常量编译器可以对其进行数据静态类型安全检查. (2)const修饰函数形式的参数:当输入参数为用户自定义类型和抽象数据类型时,应该将“值传 ...

  5. ARP输入 之 arp_rcv

    概述 arp_rcv是ARP包的入口函数,ARP模块在二层注册了类型为ETH_P_ARP的数据包回调函数arp_rcv,当收到ARP包时,二层进行分发,调用arp_rcv: arp_rcv对ARP输入 ...

  6. postgresql数据库的 to_date 和 to_timestamp 将 字符串转换为时间格式

    数据库中:字符串 转换为 时间格式 二者区别: to_data 转换为 普通的时间格式        to_timestamp 转换可为 时间戳格式出错场景: 比较同一天 日期大小的时候,很容易出错 ...

  7. VSCode查询快捷键对应功能技巧

  8. vector subscript out of range

    报这个错时会弹出一个窗口,貌似内存溢出,这是什么由于vector存放的数据超出了vector的大小所造成的. 解决方法如下: 在Vector<string> vector之后,不能直接通过 ...

  9. Git入门之在IDEA中使用Git上传maven项目

    下载安装git客户端: 参考博文:https://www.cnblogs.com/java-maowei/p/5950930.html 在IDEA怎么使用git上传spring的maven项目详解: ...

  10. Python Flask,cookie,session ,设置、获取、删除

    使用Response类的set_cookie()方法可以设置cookie: Response.set_cookie( key, //键 value='', //值 max_age=None, //秒为 ...