【枚举】【字符串哈希】Gym - 101164K - Cutting

给你A B两个串,让你切B串两刀,问你能否把切开的三个串拼成A。

哈希显然。

#include<cstdio>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
const ull MOD1=2000000011;
const ull MOD2=1000000007;
const ull base1=10007;
const ull base2=10009;
int n;
char a[10010],b[10010]/*,d[10010],e[10010]*/;
ull b1s[10010],b2s[10010];
ull hs[3][10010];
const int c[7][4]={{0,0,0,0},{0,1,2,3},{0,1,3,2},{0,2,1,3},{0,2,3,1},{0,3,1,2},{0,3,2,1}};
int main(){
	b1s[0]=b2s[0]=1;
	scanf("%s%s",b+1,a+1);
//	memcpy(d,b,sizeof(b));
//	memcpy(e,a,sizeof(a));
	n=strlen(a+1);
	for(int i=1;i<=n;++i){
		b1s[i]=b1s[i-1]*base1%MOD1;
		b2s[i]=b2s[i-1]*base2%MOD2;
	}
	ull hs2[3]={0};
	for(int i=1;i<=n;++i){
		if(a[i]<=‘Z‘){
			a[i]+=32;
		}
		if(b[i]<=‘Z‘){
			b[i]+=32;
		}
		hs2[1]=(hs2[1]*base1%MOD1+b[i]-‘a‘)%MOD1;
		hs2[2]=(hs2[2]*base2%MOD2+b[i]-‘a‘)%MOD2;
		hs[1][i]=(hs[1][i-1]*base1%MOD1+a[i]-‘a‘)%MOD1;
		hs[2][i]=(hs[2][i-1]*base2%MOD2+a[i]-‘a‘)%MOD2;
	}
	ull hs1[3][4];
	int len[4];
	len[0]=0;
	for(int i=1;i<=n-2;++i){
		for(int j=i+1;j<=n-1;++j){
			len[1]=i;
			len[2]=j-i;
			len[3]=n-j;

			hs1[1][1]=hs[1][i];
			hs1[1][2]=(hs[1][j]-hs[1][i]*b1s[len[2]]%MOD1+MOD1)%MOD1;
			hs1[1][3]=(hs[1][n]-hs[1][j]*b1s[len[3]]%MOD1+MOD1)%MOD1;
			hs1[2][1]=hs[2][i];
			hs1[2][2]=(hs[2][j]-hs[2][i]*b2s[len[2]]%MOD2+MOD2)%MOD2;
			hs1[2][3]=(hs[2][n]-hs[2][j]*b2s[len[3]]%MOD2+MOD2)%MOD2;

			for(int k=1;k<=6;++k){
				if(((hs1[1][c[k][1]]*b1s[len[c[k][2]]+len[c[k][3]]]%MOD1+hs1[1][c[k][2]]*b1s[len[c[k][3]]]%MOD1)%MOD1+hs1[1][c[k][3]])%MOD1 == hs2[1] &&
				((hs1[2][c[k][1]]*b2s[len[c[k][2]]+len[c[k][3]]]%MOD2+hs1[2][c[k][2]]*b2s[len[c[k][3]]]%MOD2)%MOD2+hs1[2][c[k][3]])%MOD2 == hs2[2]){
					puts("YES");
					for(int l=1;l<=3;++l){
						if(c[k][l]==1){
							for(int m=1;m<=len[1];++m){
								putchar(a[m]);
							}
						}
						else if(c[k][l]==2){
							for(int m=len[1]+1,mm=1;mm<=len[2];++m,++mm){
								putchar(a[m]);
							}
						}
						else{
							for(int m=len[1]+len[2]+1,mm=1;mm<=len[3];++m,++mm){
								putchar(a[m]);
							}
						}
						puts("");
					}
					return 0;
				}
			}

		}
	}
	puts("NO");
	return 0;
}
时间: 2024-10-06 02:13:22

【枚举】【字符串哈希】Gym - 101164K - Cutting的相关文章

【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 的串. 可以任意选择起点和终点,任意选择移动方案,求

【CodeForces】961 F. k-substrings 字符串哈希+二分

[题目]F. k-substrings [题意]给定长度为n的串S,对于S的每个k-子串$s_ks_{k+1}...s_{n-k+1},k\in[1,\left \lceil \frac{n}{2} \right \rceil]$,找到满足[奇数长度][严格子串][同时是前缀和后缀]的最长子串.n<=10^6. [算法]字符串哈希+二分 [题解]任意两个对应子串,它们有一个不变量--它们的中心一定是i和n-i+1.而且固定中心之后,能延伸的最长相等子串是可以二分+哈希得到的. 所以枚举k,二分+

CF1056E Check Transcription 字符串哈希

传送门 暴力枚举\(0\)的长度,如果对应的\(1\)的长度也是一个整数就去check是否合法.check使用字符串哈希. 复杂度看起来是\(O(st)\)的,但是因为\(01\)两个数中数量较多的至少有\(\frac{|s|}{2}\)个,那么最多有\(\frac{2|t|}{|s|}\)个可能的答案,而每一次check是\(O(|s|)\)的,所以总复杂度是\(O(|t|)\)的 #include<bits/stdc++.h> #define ll long long #define PL

洛谷——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&

如何获取枚举字符串,值及遍历枚举(转)

http://www.cnblogs.com/fanwenxuan/archive/2007/10/16/926019.html 枚举是一个特定的常量集合组成的独特类型using System;public enum TimeOfDay{   Morning = 0,   Afternoon = 1,   Evening }class EnumExample{   public static int Main()   {//调用方法      WriteGreeting(TimeOfDay.Mo