题面戳我

Solution

  • 首先长度为偶数可以直接判掉
  • 然后我们可以枚举删的位置,通过预处理的\(hash\),判断剩余部分是否划分成两个一样的
  • 判重要注意,我们把字符串分为三个部分\(L_l+1+L_r\),(\(L_l=L_r\)),如果上次答案和这次都出现在\(L_l\),则一定不会是不同的,因为右边的\(L_r\)是一样的,所以复制的串一定是一样的,全在\(L_r\)同理
  • 那么我们就只用判断上次出现的答案在\(L_l+1\)上,这次出现在\(L_r\)上,其实我们就可以发现复制的串变成了\(L_l\),那么我们就只用用\(Hash\)判断\(L_l\)与\(L_r\)是否相同即可,不同才是\(Unique\)
  • 上面这种情况让我\(wa\)了好久
  • 貌似又是一次跑的没暴力快qwq

Code

//It is coded by ning_mew on 7.25
#include<bits/stdc++.h>
#define LL long long
using namespace std; const int maxn=2e6+7; LL MOD[3]={19260817,20000909,19491001};
LL Hash[3][maxn],Pow[3][maxn];
LL ans=0,L,n;
char ch[maxn]; bool check(int pl){
for(int k=0;k<3;k++){
LL box=Hash[k][n],box1=0,box2=0;
if(pl==L+1){
box1=Hash[k][L];
box2=((Hash[k][n]-Hash[k][L+1]*Pow[k][L]%MOD[k])%MOD[k]+MOD[k])%MOD[k];
}
else if(pl<=L){
box2=((Hash[k][n]-Hash[k][L+1]*Pow[k][L]%MOD[k])%MOD[k]+MOD[k])%MOD[k];
box1=((Hash[k][L+1]-Hash[k][pl]*Pow[k][L+1-pl]%MOD[k]+Hash[k][pl-1]*Pow[k][L+1-pl]%MOD[k])%MOD[k]+MOD[k])%MOD[k];
}else{
box1=Hash[k][L];
box2=((Hash[k][n]-Hash[k][pl]*Pow[k][n-pl]%MOD[k]+(Hash[k][pl-1]-Hash[k][L]*Pow[k][pl-1-L]%MOD[k])*Pow[k][n-pl])%MOD[k]+MOD[k])%MOD[k];
}
if(box1!=box2)return false;
}return true;
}
bool unique(int pl){
for(int k=0;k<3;k++){
LL box1=((Hash[k][pl]-Hash[k][L+1]*Pow[k][pl-L-1])%MOD[k]+MOD[k])%MOD[k];
LL box2=((Hash[k][pl-1]-Hash[k][L]*Pow[k][pl-L-1])%MOD[k]+MOD[k])%MOD[k];
if(box1!=box2)return false;
}return true;
}
int main(){
scanf("%lld",&n);
if(n%2==0){printf("NOT POSSIBLE\n");return 0;}
L=(n-1)/2;
scanf("%s",ch+1);
for(int k=0;k<3;k++){
Pow[k][0]=1;Hash[k][0]=0;
for(int i=1;i<=n;i++){
Hash[k][i]=(Hash[k][i-1]*237+ch[i]-'A')%MOD[k];
Pow[k][i]=Pow[k][i-1]*237%MOD[k];
}
}
for(int i=1;i<=n;i++){
if(check(i)){
if(!ans)ans=i;
else{
if((ans<=L+1&&i>L+1)){
if(!unique(i)){
printf("NOT UNIQUE\n");
return 0;
}
}
}
}
}
if(!ans){printf("NOT POSSIBLE\n");return 0;}
else {
int box=0;
for(int i=1;i<=n;i++){
if(i!=ans&&box<(n-1)/2){printf("%c",ch[i]);box++;}
}
}return 0;
}

博主蒟蒻,随意转载。但必须附上原文链接:http://www.cnblogs.com/Ning-Mew/,否则你会场场比赛爆0!!!

【题解】 bzoj3916: [Baltic2014]friends (字符串Hash)的更多相关文章

  1. 【bzoj3916】[Baltic2014]friends 字符串hash

    题目描述 有三个好朋友喜欢在一起玩游戏,A君写下一个字符串S,B君将其复制一遍得到T,C君在T的任意位置(包括首尾)插入一个字符得到U.现在你得到了U,请你找出S. 输入 第一行一个数N,表示U的长度 ...

  2. 【题解】 Codeforces Edu44 F.Isomorphic Strings (字符串Hash)

    题面戳我 Solution 我们按照每个字母出现的位置进行\(hash\),比如我们记录\(a\)的位置:我们就可以把位置表示为\(0101000111\)这种形式,然后进行字符串\(hash\) 每 ...

  3. FZU 2280 Magic(字符串Hash)题解

    题意:给你n个字符串,每个字符串有一个值w,有q次询问,一共两种操作:一是“1 x y”表示把第x个串的w变为y:二是“2 x”,输出第x个串能放几次魔法.放魔法的条件是这样:用串x放魔法,如果在1~ ...

  4. POJ 3865 - Database 字符串hash

    [题意] 给一个字符串组成的矩阵,规模为n*m(n<=10000,m<=10),如果某两列中存在两行完全相同,则输出NO和两行行号和两列列号,否则输出YES [题解] 因为m很小,所以对每 ...

  5. 字符串Hash || BZOJ 3555: [Ctsc2014]企鹅QQ || P4503 [CTSC2014]企鹅QQ

    题面:[CTSC2014]企鹅QQ 题解:无 代码: #include<iostream> #include<cstring> #include<cstdio> # ...

  6. CodeForces 1056E - Check Transcription - [字符串hash]

    题目链接:https://codeforces.com/problemset/problem/1056/E One of Arkady's friends works at a huge radio ...

  7. 【bzoj3555】[Ctsc2014]企鹅QQ 字符串hash

    题目描述 PenguinQQ是中国最大.最具影响力的SNS(Social Networking Services)网站,以实名制为基础,为用户提供日志.群.即时通讯.相册.集市等丰富强大的互联网功能体 ...

  8. [CQOI2014][bzoj3507] 通配符匹配 [字符串hash+dp]

    题面 传送门 思路 0x01 KMP 一个非常显然而优秀的想法:把模板串按照'*'分段,然后对于每一段求$next$,'?'就当成可以对于任意字符匹配就行了 对于每个文本串,从前往后找第一个可以匹配的 ...

  9. 【codeforces 514C】Watto and Mechanism(字符串hash)

    [题目链接]:http://codeforces.com/contest/514/problem/C [题意] 给你n个字符串; 然后给你m个询问;->m个字符串 对于每一个询问字符串 你需要在 ...

  10. (通俗易懂小白入门)字符串Hash+map判重——暴力且优雅

    字符串Hash 今天我们要讲解的是用于处理字符串匹配查重的一个算法,当我们处理一些问题如给出10000个字符串输出其中不同的个数,或者给一个长度100000的字符串,找出其中相同的字符串有多少个(这样 ...

随机推荐

  1. Continued Fractions CodeForces - 305B (java+高精 / 数学)

    A continued fraction of height n is a fraction of form . You are given two rational numbers, one is ...

  2. Spring AOP详细介绍

    AOP称为面向切面编程,在程序开发中主要用来解决一些系统层面上的问题,比如日志,事务,权限等待,Struts2的拦截器设计就是基于AOP的思想,是个比较经典的例子. 一 AOP的基本概念 (1)Asp ...

  3. linux中mariadb的安装

    在Linux中mariaDB的安装 MariaDB其实就是MySQL的分支,是为了应对MySQL的即将的闭源风险所产生的. Linux系统中软件包的格式为mysql.rpm格式. 通过yum去安装 L ...

  4. 结对项目:ATM

    一:结对项目名称:ATM 二:源代码及单元测试代码网址链接:https://github.com/tpp531853660 三:结对人的博客链接:http://www.cnblogs.com/Joan ...

  5. 福州大学软件工程1816 | W班 第2次作业成绩排名

    作业链接 词频统计基础功能 评分细则 本次个人项目分数由两部分组成(博客分满分40分+程序得分满分60分) 博客评分规则 在文章开头给出你们Fork仓库的Github项目地址.(1') 在开始实现程序 ...

  6. pip ipython启动错误 Fatal error in launcher: Unable to create process using

    完整的错误提示: C:\Users\yyy>ipython3Fatal error in launcher: Unable to create process using '"c:\u ...

  7. vue路由动态过渡效果

    不多说,直接上代码 import Vue from 'vue' //引入vue import VueRouter from 'vue-router' //引入路由 Vue.use(VueRouter) ...

  8. js压箱底的宝贝

    框架的确好用, 不过他们也隐藏了JavaScript中丑陋的细节和DOM的运作机制. 如果你的目标是敢于自称"我懂JavaScript", 那么花时间学习框架无异于南辕北辙. 下面 ...

  9. Oracle创建'数据库'三步走

    --创建表空间 create tablespace waterboss datafile 'd:\waterboss.dbf' size 100m autoextend on next 10m; -- ...

  10. js函数使用prototype和不适用prototype的区别

    js中类定义函数时用prototype与不用的区别 原创 2017年06月05日 12:25:41 标签: 函数 / prototype / class   首先来看一个实例: function Li ...