当前位置: 首页 > news >正文

【bzoj3916】[Baltic2014]friends 字符串hash

题目描述

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

输入

第一行一个数N,表示U的长度.
第二行一个字符串U,保证U由大写字母组成

输出

输出一行,若S不存在,输出"NOT POSSIBLE".若S不唯一,输出"NOT UNIQUE".否则输出S.

样例输入

Sample Input1:
7
ABXCABC
Sample Input2:
6
ABCDEF
Sample Input3:
9
ABABABABA

样例输出

Sample Output1:
ABC
Sample Output2:
NOT POSSIBLE
Sample Output3:
NOT UNIQUE


题解

字符串hash

首先偶数长度一定不存在,输出NOT POSSIBLE

奇数则先将每个前缀的hash值求出来,然后枚举多余字符位置,并根据位置与n/2和n/2+1的关系判断并求出前后两个字符串的hash值。

然后hash值相同时比较一下就好了。

#include <cstdio>
#define N 2000010
char str[N];
unsigned long long hash[N] , base[N] , x , y , ans;
int main()
{
	int n , i , p , flag = 0 , sum = 0;
	scanf("%d%s" , &n , str + 1);
	if(n % 2 == 0)
	{
		printf("NOT POSSIBLE\n");
		return 0;
	}
	base[0] = 1;
	for(i = 1 ; i <= n ; i ++ ) hash[i] = hash[i - 1] * 131 + str[i] , base[i] = base[i - 1] * 131;
	for(i = 1 ; i <= n ; i ++ )
	{
		if(i <= n / 2) x = hash[n / 2 + 1] - hash[i] * base[n / 2 - i + 1] + hash[i - 1] * base[n / 2 - i + 1];
		else x = hash[n / 2];
		if(i <= n / 2 + 1) y = hash[n] - hash[n - n / 2] * base[n / 2];
		else y = (hash[i - 1] - hash[n / 2] * base[i - n / 2 - 1]) * base[n - i] + hash[n] - hash[i] * base[n - i];
		if(x == y)
		{
			if(flag && ans != x)
			{
				printf("NOT UNIQUE\n");
				return 0;
			}
			flag = 1 , ans = x , p = i;
		}
	}
	if(!flag)
	{
		printf("NOT POSSIBLE\n");
		return 0;
	}
	for(i = 1 ; sum < n / 2 ; i ++ )
		if(i != p)
			printf("%c" , str[i]) , sum ++ ;
	printf("\n");
	return 0;
}

 

 

转载于:https://www.cnblogs.com/GXZlegend/p/6871534.html

相关文章:

  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • 单链表的逆置
  • CentOS6.3上安装与配置nginx+php+mysql环境
  • phoenixframe自己主动化測试平台对div弹出框(如弹出的div登陆框)的处理
  • atitit.文件上传带进度条的实现原理and组件选型and最佳实践总结O7
  • android studio 1
  • Mysql 实现 序列的使用
  • 转载 FreeNAS的安装和简单配置 http://freenas.cn/?p=342
  • (转载)Linux 多线程条件变量同步
  • 编程语言类型划分
  • 关于sublime text 3 pylinter的错误提示
  • nil的使用
  • #Java第九次作业--输入输出流和文件操作
  • 路径层、裁剪区域
  • to_char函数 官方文档详解(数字格式转换和日期转换)
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 08.Android之View事件问题
  • Consul Config 使用Git做版本控制的实现
  • export和import的用法总结
  • in typeof instanceof ===这些运算符有什么作用
  • Java Agent 学习笔记
  • JavaScript-Array类型
  • JavaScript异步流程控制的前世今生
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • PhantomJS 安装
  • Python学习之路13-记分
  • session共享问题解决方案
  • 一天一个设计模式之JS实现——适配器模式
  • 湖北分布式智能数据采集方法有哪些?
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • ###C语言程序设计-----C语言学习(6)#
  • (10)ATF MMU转换表
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (二)Eureka服务搭建,服务注册,服务发现
  • (二)换源+apt-get基础配置+搜狗拼音
  • (附源码)php投票系统 毕业设计 121500
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (转)C语言家族扩展收藏 (转)C语言家族扩展
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .net mvc 获取url中controller和action
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .NET的微型Web框架 Nancy
  • .Net环境下的缓存技术介绍
  • .NET简谈设计模式之(单件模式)
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • .NET实现之(自动更新)
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)
  • /var/lib/dpkg/lock 锁定问题
  • @EnableAsync和@Async开始异步任务支持
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [c]统计数字
  • [C++]Leetcode17电话号码的字母组合
  • [C++]四种方式求解最大子序列求和问题
  • [java刷算法]牛客—剑指offer链表有环的入口、反转链表、合并排序链表
  • [js]- 两个对象的合并(Object.assign)