Codeforces #30E: Tricky and Clever Password 题解

(权限题)NFLSoj #32: 辐射 题解 先吐槽一波这题实在是太难写了。。。 借鉴youyl的博客: 考虑一个辐射源对其他点的贡献,就是若干个正方形叠加在一起。 如: 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 2 2 2 1 0 0 1 2 3 2 1 0 0 1 2 2 2 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 考虑每个正方形,一个通用的思路就是差分: 0 0 0 0 阅读详情

首先可以发现一个结论

我们枚举一个中间回文串的中心点,会发现我们一定会选择以它为中心的最长的回文串

因为考虑左边右边的两个串,如果它们与长回文串不重叠,那么取长串显然更优;如果重叠,那么不重叠的部分仍然可以取,重叠的部分已经被我的长串取掉了,也不亏。所以取长串肯定最优

对于每个长度的后缀,如果前面有多个子串和它匹配,那么显然越靠前越优

我们先求对于每一个位置,能和后缀匹配的最长长度,记为p[i]

我们枚举位置以后二分长度,字符串哈希一发就好

然后我们维护一个数组minpos,minpos[i]表示长度为i的后缀最早在哪里出现过

我们从左往右扫描p数组,对于第i个位置,minpos[1]~minpos[p[i]]的答案都不会超过i

因为是从左往右扫描的,所以如果碰到已经填过的说明有更小的答案,就不用再往下更新了,这样每个格子最多被更新一次,复杂度是线性的

然后跑一趟manacher找出每个位置为中心的最长半径

然后枚举中心点,因为考虑到minpos[i]数组是单调递增的(因为条件越来越苛刻)所以可以二分左右串的长度,检查是否不与中间串重叠就好了

总复杂度O(nlogn)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#define LL long long
#define LB long double
#define x first
#define y second
#define Pair pair<int,int>
#define pb push_back
#define pf push_front
#define mp make_pair
#define LOWBIT(x) x & (-x)
using namespace std;

const int MOD=1e9+7;
const LL LINF=2e16;
const int INF=2e9;
const int magic=348;
const double eps=1e-10;
const double pi=3.14159265;

inline int getint()
{
    char ch;int res;bool f;
    while (!isdigit(ch=getchar()) && ch!='-') {}
    if (ch=='-') f=false,res=0; else f=true,res=ch-'0';
    while (isdigit(ch=getchar())) res=res*10+ch-'0';
    return f?res:-res;
}

char ss[300048];
char s[300048];int len;

int RL[300048],maxlen[300048];

int minpos[100048];
LL hsh1[100048],hsh2[100048];
LL hsh3[100048],hsh4[100048];
LL fp1[100048],fp2[100048];
const int p=998244353;
const int MOD1=19260817,MOD2=1e9+7;

void init_hash()
{
	int i;
	fp1[0]=fp2[0]=1;
	for (i=1;i<=len;i++) fp1[i]=(fp1[i-1]*p)%MOD1,fp2[i]=(fp2[i-1]*p)%MOD2;
	for (i=1;i<=len;i++) hsh1[i]=(hsh1[i-1]*p+s[i])%MOD1,hsh2[i]=(hsh2[i-1]*p+s[i])%MOD2;
	for (i=len;i>=1;i--) hsh3[i]=(hsh3[i+1]*p+s[i])%MOD1,hsh4[i]=(hsh4[i+1]*p+s[i])%MOD2;
}

Pair gethash1(int left,int right)
{
	pair<LL,LL> res;
	res.x=((hsh1[right]-(hsh1[left-1]*fp1[right-left+1])%MOD1)%MOD1+MOD1)%MOD1;
	res.y=((hsh2[right]-(hsh2[left-1]*fp2[right-left+1])%MOD2)%MOD2+MOD2)%MOD2;
	return res;
}

Pair gethash2(int left,int right)
{
	pair<LL,LL> res;
	res.x=((hsh3[left]-(hsh3[right+1]*fp1[right-left+1])%MOD1)%MOD1+MOD1)%MOD1;
	res.y=((hsh4[left]-(hsh4[right+1]*fp2[right-left+1])%MOD2)%MOD2+MOD2)%MOD2;
	return res;
}

int main ()
{
	int i,j;
	scanf("%s",s+1);len=strlen(s+1);
	int cur=1;
	for (i=1;i<=len;i++) ss[cur++]='#',ss[cur++]=s[i];
	ss[cur]='#';
	int llen=cur,maxright=0,mpos=0;
	for (i=1;i<=llen;i++)
	{
		if (i<maxright)
			RL[i]=min(RL[2*mpos-i],maxright-i);
		else
			RL[i]=1;
		while (i-RL[i]>=1 && i+RL[i]<=llen && ss[i-RL[i]]==ss[i+RL[i]]) RL[i]++;
		if (i+RL[i]>maxright)
		{
			maxright=i+RL[i];
			mpos=i;
		}
	}
	init_hash();
	for (i=1;i<=llen;i++)
		if (ss[i]!='#') maxlen[i/2]=RL[i]-1;
	for (i=1;i<=len;i++)
	{
		int maxl=0,l=1,r=len,mid;
		while (l<=r)
		{
			mid=(l+r)>>1;
			if (gethash1(i,i+mid-1)==gethash2(len-mid+1,len))
			{
				maxl=mid;
				l=mid+1;
			}
			else
			{
				r=mid-1;
			}
		}
		if (maxl)
		{
			for (j=maxl;j>=1 && !minpos[j];j--) minpos[j]=i;
		}
	}
	int anslen=0;
	Pair ans1=mp(-1,-1),ans2=mp(-1,-1),ans3=mp(-1,-1);
	for (i=1;i<=len;i++)
	{
		if (maxlen[i]>anslen)
		{
			anslen=maxlen[i];
			ans1=ans3=mp(-1,-1);ans2=mp(i-(maxlen[i]-1)/2,i+(maxlen[i]-1)/2);
		}
		int l=1,r=len,maxl=0,mid;
		while (l<=r)
		{
			mid=(l+r)>>1;
			if (len-mid+1>i+(maxlen[i]-1)/2 && minpos[mid] && minpos[mid]+mid-1<i-(maxlen[i]-1)/2)
			{
				maxl=mid;
				l=mid+1;
			}
			else
			{
				r=mid-1;
			}
		}
		if (maxl)
		{
			if (maxl+maxl+maxlen[i]>anslen)
			{
				anslen=maxl+maxl+maxlen[i];
				ans1=mp(minpos[maxl],minpos[maxl]+maxl-1);
				ans2=mp(i-(maxlen[i]-1)/2,i+(maxlen[i]-1)/2);
				ans3=mp(len-maxl+1,len);
			}
		}
	}
	if (ans1.x==-1)
	{
		printf("1\n");
		printf("%d %d\n",ans2.x,ans2.y-ans2.x+1);
	}
	else
	{
		printf("3\n");
		printf("%d %d\n",ans1.x,ans1.y-ans1.x+1);
		printf("%d %d\n",ans2.x,ans2.y-ans2.x+1);
		printf("%d %d\n",ans3.x,ans3.y-ans3.x+1);
	}
	return 0;
}

尝试优化这个做法

首先对于求minpos[i]的过程,如果我们把原字符串反过来接在原串前面,跑一遍KMP,那么fail数组对应的就是我需要的minpos

于是这个部分可以做到O(n)

考虑最后统计答案的部分

我们预处理数组f[i]表示如果中间的回文串的左端点在i,单考虑左边可以取到的最大长度

因为minpos是单调的,所以我们仍然可以使用打标记的方法,只给没有打标记的格子更新答案,每个格子最多被更新一次,复杂度是线性的

最后枚举中心点的时候,f[i]和右边的长度取一个min就好

总复杂度O(n)

#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <utility>
#include <cctype>
#include <algorithm>
#include <bitset>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <cmath>
#define LL long long
#define LB long double
#define x first
#define y second
#define Pair pair<int,int>
#define pb push_back
#define pf push_front
#define mp make_pair
#define LOWBIT(x) x & (-x)
using namespace std;

const int MOD=1e9+7;
const LL LINF=2e16;
const int INF=2e9;
const int magic=348;
const double eps=1e-10;
const double pi=3.14159265;

inline int getint()
{
    char ch;int res;bool f;
    while (!isdigit(ch=getchar()) && ch!='-') {}
    if (ch=='-') f=false,res=0; else f=true,res=ch-'0';
    while (isdigit(ch=getchar())) res=res*10+ch-'0';
    return f?res:-res;
}

int len,slen;
char s[300048],ss[300048];
int RL[300048],maxright,pos,maxlen[300048],mlen[300048],minpos[300048];
int fail[300048];
int f[300048];

void getfail()
{
	int k=-1,j=0;
	fail[0]=-1;
	while (j<=slen)
	{
		if (k==-1 || ss[j+1]==ss[k+1])
			fail[++j]=++k;
		else
			k=fail[k];
	}
}

void getRL()
{
	memset(ss,'\0',sizeof(ss));
	int i,cur=1;
	for (i=1;i<=len;i++)
	{
		ss[cur++]='#';
		ss[cur++]=s[i];
	}
	ss[cur]='#';slen=cur;
	maxright=pos=0;
	for (i=1;i<=slen;i++)
	{
		if (i<maxright)
			RL[i]=min(maxright-i,RL[2*pos-i]);
		else
			RL[i]=1;
		while (i-RL[i]>=1 && i+RL[i]<=slen && ss[i-RL[i]]==ss[i+RL[i]]) RL[i]++;
		if (i+RL[i]>maxright)
		{
			maxright=i+RL[i];
			pos=i;
		}
	}
}

int main ()
{
	//freopen ("30e.in","r",stdin);
	//freopen ("30e.out","w",stdout);
	int i,j;
	scanf("%s",s+1);len=strlen(s+1);
	for (i=1;i<=len;i++) ss[i]=s[len-i+1];
	ss[len+1]='$';
	for (i=len+2;i<=len+2+len-1;i++) ss[i]=s[i-len-1];
	slen=strlen(ss+1);
	getfail();
	for (i=len+2;i<=slen;i++) mlen[i-len-1-fail[i]+1]=max(mlen[i-len-1-fail[i]+1],fail[i]);
	for (i=1;i<=len;i++)
		for (j=mlen[i];j>=1 && !minpos[j];j--)
			minpos[j]=i;
	getRL();
	//return 0;
	for (i=1;i<=slen;i++) if (ss[i]!='#') maxlen[i/2]=RL[i]-1;
	//cout<<"*"<<endl;
	for (i=len;i>=1;i--)
		if (minpos[i])
			for (j=minpos[i]+i;j<=len && !f[j];j++)
				f[j]=i;
	//return 0;
	Pair ans1=mp(-1,-1),ans2=mp(-1,-1),ans3=mp(-1,-1);int anslen=0;
	for (i=1;i<=len;i++)
	{
		int ll=i-(maxlen[i]-1)/2,rr=i+(maxlen[i]-1)/2;
		int add=min(len-rr,f[ll]);
		if (maxlen[i]+add+add>anslen)
		{
			anslen=maxlen[i]+add+add;
			ans2=mp(i-(maxlen[i]-1)/2,maxlen[i]);
			if (add)
			{
				ans1=mp(minpos[add],add);
				ans3=mp(len-add+1,add);
			}
			else
				ans1=ans3=mp(-1,-1);
		}
	}
	if (ans1.x==-1)
	{
		printf("1\n");
		printf("%d %d\n",ans2.x,ans2.y);
	}
	else
	{
		printf("3\n");
		printf("%d %d\n",ans1.x,ans1.y);
		printf("%d %d\n",ans2.x,ans2.y);
		printf("%d %d\n",ans3.x,ans3.y);
	}
	return 0;
}



Codeforces D1/D2. Prefix-Suffix Palindrome (Manacher) /详解 D1. Prefix-Suffix Palindrome (Easy version) D2. Prefix-Suffix Palindrome (Hard version) 题意: 对于给出的字符串,可截取其前缀和后缀,求能组成的最长回文串。 思路: 正常来说暴力的思路是先匹配前缀pre和后缀suf,找到第一个不匹配的l和r,然后在由l开始从左向右求最长的回文串palindrome,以及由r开始从右向左求最长的回文串palindrome,那么pre+palindrome+suf就是答案。 很显然,这是一个O(n^2)时间复杂度的算法,那么还有哪里可以优化呢?其实关于求回文串palindrom 立即下载

相关推荐

汽车OBD接口实战:如何用STM32读取CAN总线数据(附完整代码)

本文详细介绍了如何利用STM32微控制器通过汽车OBD接口读取CAN总线数据的完整实战方案。内容涵盖硬件连接(如OBD引脚定义与TJA1050收发器接线)、STM32的CAN外设初始化与滤波器配置,并深入解析OBD-II诊断协议,演示了如何请求和解析发动机转速、车速等关键数据。文末提供了构建稳定数据读取系统的代码框架与错误处理建议,为嵌入式开发者和汽车电子爱好者提供了从零到一的实践指南。

9q8w7e6r5的博客 299

【Codeforces】30E. Tricky and Clever Password-KMP&manacher

KMP,manacher混用

远行客 477

Python数据清洗实战:用RapidFuzz搞定模糊匹配(附完整代码示例)

本文详细介绍了在Python数据清洗中,如何利用RapidFuzz库高效解决字符模糊匹配难题。通过实战代码示例,演示了从处理拼写错误、格式不一致的脏数据,到构建实体对齐与记录去重的完整清洗管道,帮助开发者提升数据质量与处理效率。

pear55的博客 532

算法练习——Tricky and Clever Password

问题描述   在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,好记又难以破解。后来,他才知道这种密码是一个长度为奇数的回文串。   Copa 害怕忘记密码,所以他决定把密码写在一张纸上。他发现这样保存密码不安全,于是他决定按下述方法加密密码:他选定一个整数 X ,保证 X 不小于 0 ,且 2X 严格小

zm1_1zm 971

SpringBoot项目整合Knife4j接口文档

写满接口信息的文档,每条接口包括:请求参数,响应参数,接口地址,接口名称,请求类型,请求格式,备注。

诨号无敌鸭的博客 1017

LLaMA Factory添加新模型template的实战解析

本文主要介绍了LLaMA Factory添加新模型template的实战解析,希望对使用大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 实战解析 2.1 检查代码 2.2 修改代码

herosunly的博客 19万+

[好题][manacher][kmp]Tricky and Clever Password Codeforces30E

题目描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,好记又难以破解。后来,他才知道这种密码是一个长度为奇数的回文串。 Copa 害怕忘记密码,所以他决定把密码写在一张纸上。他发现这样保存密码不安全,于是他决定按下述方法加密密码:他选定一个整数 X ,保证 X 不小于 0 ,且 2X 严格小于串长度。然后他把密码分成 3 段,最前面的 X 个字符为一段,最后面的 X 个字符为一段,剩余的字符为一段。不妨把这三段依次

Cloth的博客 566

YOLOv8 骨骼结构识别详细说明

YOLOv8骨骼结构识别是一种基于深度学习技术的医学影像分析方法,主要用于X光、CT等影像中的骨骼定位与识别。该系统具有多骨骼同步识别能力,可应用于手部、脊柱、骨盆等不同部位,并能精确定位骨骼关键点。技术实现包括数据预处理、模型训练、推理检测、关键点分析和批量处理五个核心模块,支持骨折检测、骨龄评估等临床应用。该系统需注意医学合规性,要求高质量标注数据,并针对骨骼影像特点进行特征工程优化,同时考虑不同设备的部署需求。

u010117029的博客 332

codeforces 30E 蓝桥杯 Tricky and Clever Password

算法训练 Tricky and Clever Password   时间限制:2.0s   内存限制:256.0MB      问题描述   在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,好记又难以破解。后来,他才知道这种密码是一个长度为奇数的回文串。   Copa 害怕

tanmlh的专栏 3157

YOLOv9电力巡检实战:绝缘子破裂/鸟巢识别+无人机自动定位

摘要:本文聚焦电力输电线路巡检的效率与安全痛点,提出基于YOLOv9与无人机的智能巡检解决方案。针对绝缘子破裂、鸟巢等高危缺陷,通过“无人机改装-模型训练-缺陷识别-工单生成”四阶段工程落地流程,实现全自动化巡检。系统采用大疆M300无人机搭载RTK模块与Jetson边缘计算盒,结合改进YOLOv9模型实时识别5类缺陷,通过4G传输将GPS定位与缺陷数据同步至工单系统。实测表明,该方案巡检效率达50公里/天(较人工提升10倍),缺陷发现率95%(提升40%),事故预防率98%。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1511

BES 平台 SDK之 美格信Dongle 连接

最近项目到了试产阶段,需要用到美格信的Dongel 来测试ANC 相关功能。在此简单介绍下如何连接Dongel 的操作步骤。

谢文浩博客 926

Tricky and Clever Password 【KMP+Manacher】【蓝桥杯试题】

问题描述   在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,好记又难以破解。后来,他才知道这种密码是一个长度为奇数的回文串。   Copa 害怕忘记密码,所以他决定把密码写在一张纸上。他发现这样保存密码不安全,于是他决定按下述方法加密密码:他选定一个整数 X ,保证 X 不小于 0 ,且 2X 严格小

乐着过一辈子的专栏 2846

国密GmSSL v2版本命令行方式生成国密sm2私钥、公钥、签名和验证签名

GmSSL是国密算法的工具库(主要包含SM2、SM3、SM4和国密SSL证书生成等功能),项目本身是OpenSSL的分支,但是截至文章发布为止,OpenSSL主分支的国密算法并不完善,目前并不支持签名和解签,所以国密算法这块还是需要使用GmSSL工具库。网上现在并没有v2版本的GmSSL可用的命令行文章,本章用于记录这些命令。本文原创自csdn博客,其他网站看到这篇文章都是盗,版,爬。虫。网站,支持原创,远离盗版。

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 4606

codeforces #30E Tricky and Clever Password KMP+Manacher+二分

题目大意:给定一个字符串SS,要求分成A+prefix+B+middle+C+suffixA+prefix+B+middle+C+suffix6段,满足: |A|=|C||A|=|C| |B||B|为奇数 A+B+CA+B+C为回文串 除BB外所有段长度都可以为00 要求最大化|A|+|B|+|C||A|+|B|+|C|,输出一组方案(|A|=|C|=0|A|=|C|=0时只输出BB)首先

世界 3328

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝桥杯 ALGO-133 Tricky and Clever Password

题意:题目的意思已经描述的很详细了,这里只作简要的说明,就是存在这样的一个字符串,A+pre+B+middle+C+suffix,我们要求的就是pre+middle+suffix的最大值。 思路:最主要的思路就是枚举中缀的所有情况,用malacher算法求出以该节点的半径,那么middle就出来了,然后根据middle求pre+suffix,由于pre==suffix,类似于回文串的情况,但...

qq_42152681的博客 364

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Tricky and Clever Passwordcsnd

一开始不懂什么是KMP算法,网上搜了一下,觉得这篇写得让我最能接受 http://www.ituring.com.cn/article/59881 我从里面摘抄了一些点子: 1.KMP算法优化字符串匹配的方法:寻找最长首尾匹配位置。 2.首尾匹配位置就是说,给定一个字符串N(长度为n,即N由N[0]...N[n]组成),找出是否存在这样的i,使得N[0]=N[n-i],N1=N[n-i-1

wyi06的博客 725

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

算法训练 Tricky and Clever Password(Python)

问题描述 在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,好记又难以破解。后来,他才知道这种密码是一个长度为奇数的回文串。 Copa 害怕忘记密码,所以他决定把密码写在一张纸上。他发现这样保存密码不安全,于是他决定按下述方法加密密码:他选定一个整数 X ,保证 X 不小于 0 ,且 2X 严格小于串长度。然后他把密码分成 3 段,最前面的 X 个字符为一段,最后面的 X 个字符为一段,剩余的字符为一段。不妨把这三段依次称

eveee1123的博客 370

Tricky and Clever Password

蓝桥杯试题 算法训练 Tricky and Clever Password 资源限制 时间限制:2.0s 内存限制:256.0MB 问题描述   在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,好记又难以破解。后来,他才知道这种密码是一个长度为奇数的回文串。 Copa 害怕忘记密码,所以他决定把密码写在一张纸上。他发现这样保存密码不安全,于是他决定按下述方法加密密码:他选定一个整数 X ,保证 X 不小于 0 ,且

伍若谷的博客 283

蓝桥杯-Tricky and Clever Password(java)

算法训练 Tricky and Clever Password 时间限制:2.0s 内存限制:256.0MB 问题描述   在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,...

好好学java 742

Codeforces 30E Tricky and Clever Password-字符串匹配

传送门 题意: 密码是一个长度为奇数的回文串,现在我们对这个密码进行加密:把密码分成 3 段,最前面的 X 个字符为一段,最后面的 X 个字符为一段,剩余的字符为一段。这三段依次称之为 prefix, suffix, middle 。middle 的长度为一个大于 0 的奇数, prefix 、 suffix 的长度相等。加密后的密码即为 A + prefix + B + middle +...

Fizzmy的博客 591

CodeForces 30E Tricky and Clever Password(hash+manacher)

题意:把一个回文串拆成prefix, middle, suffix三部分,中间那部分必须得是奇数,prefix与suffix对称并且长度可为0,把这3部分放进一个串中,成为A+prefix+B+middle+C+suffix,要使回文串最长,输出分界的位置。 做法:首先求出以小于等于i为结尾的prefix能匹配的最长suffix是多长,可以看出当左边界匹配成功,就移动右边界,符合单调性。

glq007的acm的奋斗 2739

Codeforces Problemset 30E(#30 div.1 E)

【题目大意】 有一个长度为奇数的回文串,他被加密了一下,原本是prefix + middle + suffix,变成了A + prefix + B + middle + C + suffix,其中prefix倒过来就是 suffix 其中|A||B||C||suffix|可能为0,给你加密以后的串,输出一种最长的原串的方案 【输入】 一行,表示加密串,只包含小写字母 【输出】 如果

weixinding的专栏 1887

算法笔记_055:蓝桥杯练习 Tricky and Clever Password (Java)

目录 1 问题描述 2 解决方案   1 问题描述 问题描述   在年轻的时候,我们故事中的英雄——国王 Copa——他的私人数据并不是完全安全地隐蔽。对他来说是,这不可接受的。因此,他发明了一种密码,好记又难以破解。后来,他才知道这种密码是一个长度为奇数的回文串。  Copa 害怕忘记密码,所以他决定把密码写在一张纸上。他发现这样保存密码不安全,于是他决定按下述方法加密密...

weixin_34293246的博客 381

UVA 1078 Password Suspects(AC自动机+dp)

状态方程d[u][len][st],代表最后一个节点是u,长度为len,已经有st个串所能构成的密码数,记忆化搜索就行了。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> typedef long lo...

qq_33901573的博客 1512

Codeforces 30E Tricky and Clever Password Manacher + KMP + 前缀和

题目大意: 就是现在有一个长度为奇数的个回文串串T被加密成了 A + prefix + B + middle + C + suffix的形式, 其中 T = prefix + middle + suffix , 这六个部分可以是空的, 现在对于给出的加密后的串求原串T的最大可能长度, 其中middle长度也是奇数, preifx长度和suffix长度相等, 输入的字符串长度 大致思路:

Gatevin的专栏 2399
上一篇: Codeforces #356E: Xenia and String Problem 题解
下一篇: ZOJ3494: BCD Code 题解
IcePrincess_1968
博客等级 码龄9年 13粉丝 182原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值