【字符串哈希】bzoj3916 [Baltic2014]friends

枚举断点,哈希判断。

#include<cstdio>
using namespace std;
typedef unsigned long long ull;
ull hs,hs1,hs2,seeds[1000010],hsgoal;
int n;
int del=-1;
char s[2000002],s2[2000002];
int main()
{
	seeds[0]=1;
	for(int i=1;i<=1000009;++i) seeds[i]=seeds[i-1]*31;
	scanf("%d%s",&n,s);
	if(!(n&1)) {puts("NOT POSSIBLE"); return 0;}
	for(int i=(n>>1)+1;i<n;++i)
	  hs=hs*31+(s[i]-64);
	for(int i=1;i<=(n>>1);++i)
	  hs2=hs2*31+(s[i]-64);
	if(hs2==hs)
	  {
	  	del=0;
	  	hsgoal=hs;
	  }
	for(int i=1;i<=(n>>1);++i)
	  {
	  	hs2-=((s[i]-64)*seeds[(n>>1)-i]);
	  	hs1=hs1*31+(s[i-1]-64);
	  	if(hs1*seeds[(n>>1)-i]+hs2==hs)
	  	  {
	  	  	if(del!=-1&&hsgoal!=hs)
	  	  	  {
	  	  	  	puts("NOT UNIQUE");
	  	  	  	return 0;
	  	  	  }
	  	  	else
			  {
			  	del=i;
			  	hsgoal=hs;
			  }
	  	  }
	  }
	hs=hs1=hs2=0;
	for(int i=0;i<(n>>1);++i)
	  hs=hs*31+(s[i]-64);
	for(int i=(n>>1)+1;i<n;++i)
	  hs2=hs2*31+(s[i]-64);
	for(int i=(n>>1)+1;i<n;++i)
	  {
	  	hs2-=((s[i]-64)*seeds[n-1-i]);
	  	hs1=hs1*31+(s[i-1]-64);
	  	if(hs1*seeds[n-1-i]+hs2==hs)
	  	  {
	  	  	if(del!=-1&&hsgoal!=hs)
	  	  	  {
	  	  	  	puts("NOT UNIQUE");
	  	  	  	return 0;
	  	  	  }
	  	  	else
			  {
			  	del=i;
			  	hsgoal=hs;
			  }
	  	  }
	  }
	if(del==-1)
	  puts("NOT POSSIBLE");
	else if(del<=(n>>1))
	  {
	  	for(int i=0;i<=(n>>1);++i)
	  	  if(i!=del)
	  	    putchar(s[i]);
	  	puts("");
	  }
	else
	  {
	  	for(int i=(n>>1);i<n;++i)
	  	  if(i!=del)
	  	    putchar(s[i]);
	  	puts("");
	  }
	return 0;
}
时间: 2024-11-13 08:01:59

【字符串哈希】bzoj3916 [Baltic2014]friends的相关文章

洛谷——P3370 【模板】字符串哈希

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明

字符串哈希(自然溢出模板)

P3370 [模板]字符串哈希 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明 时空限制:1000ms,128M 数据

UvaLive 6439 Pasti Pas! 字符串哈希

链接:http://vjudge.net/problem/viewProblem.action?id=47586 题意:给一个字符串,可以将从前数第i~j和从后数第i~j字符串看作一个字符,问整段字符串看作一个回文里有多少个字符. 思路:字符串哈希,从前开始哈希也从后开始哈希,遇到哈希值相同就多两个字符,最后处理一下中间的字符即可. 代码: #include <iostream> #include <cstdio> #include <cstring> #include

HDU 4821 杭州现场赛:每个片段字符串哈希比较

I - String Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4821 Description Given a string S and two integers L and M, we consider a substring of S as "recoverable" if and only if (i) I

HDU--4821(字符串哈希)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4821 用到了BKD字符串哈希的方法,一直不是很会哈希,总是用map,但是很显然,map并不是万能的. 用哈希的方法可以递推的求出所有子串的哈希值,最后用map维护答案即可:注意下long long #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #include&

[模板]字符串哈希的简易做法

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明

【NOIP模拟】Grid(字符串哈希)

题目背景 SOURCE:NOIP2016-RZZ-1 T3 题目描述 有一个 2×N 的矩阵,矩阵的每个位置上都是一个英文小写字符. 现在需要从某一个位置开始,每次可以移动到一个没有到过的相邻位置,即从 (i,j) 可以移动到 (i-1,j)(i+1,j)(i,j-1)(i,j+1) (要求该位置在矩阵上且之前没有到过). 从选取的起点开始,经过 2N-1 次移动后,将会走过矩阵的每一个位置,将移动经过的格子依次取出来就得到了一个长度为 2N 的串. 可以任意选择起点和终点,任意选择移动方案,求

洛谷 P3370 【模板】字符串哈希

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明

HDU 3973 AC&#39;s String 字符串哈希

HDU 3973 通过哈希函数将一个字符串转化为一个整数,通过特定的方式可以使得这个哈希值几乎没有冲突(这就是关键之处,几乎没有视为没有= =!, 其实也可以考虑实现哈希冲突时的处理,只是这道题没必要而已),然后使用线段树维护修改后的哈希值. 因为输入的字符串只有26个,考虑使用一个大于等于26的素数p作为进制,然后将原串转化为一个p进制的数mod 2^63(也相当于自然溢出),然后这个数存入map中,然后使用线段树维护长串区间的哈希值,hash[l, r]表示将区间[l, r]的字符串转化为p

luogu P3370 【模板】字符串哈希

题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的想好好练习哈希的话,请自觉,否则请右转PJ试炼场:) 输入输出格式 输入格式: 第一行包含一个整数N,为字符串的个数. 接下来N行每行包含一个字符串,为所提供的字符串. 输出格式: 输出包含一行,包含一个整数,为不同的字符串个数. 输入输出样例 输入样例#1: 5 abc aaaa abc abcc 12345 输出样例#1: 4 说明