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 立即下载

相关推荐

STM32移植LVGL(LittleVGL)

**STM32移植LVGL(LittleVGL)**

qq_53000374的博客 1万+

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

KMP,manacher混用

远行客 477

汽车零部件智能装配:C#+YOLOv8实现螺栓漏装检测与齿轮错位识别(附PLC通信与机械臂控制)

YOLOv8:小目标检测的最优解相比YOLOv7,YOLOv8的C2f特征融合网络对小目标(5-10mm螺栓)检测精度提升12%,且推理速度快8%;支持大输入尺寸(不显著增加耗时),可放大螺栓细节;官方提供yolov8n.pt(nano版),在边缘计算盒上能跑40+FPS,满足实时性。C#:工业软件的“兼容性核心”主流PLC(西门子S7-1200/1500)、机械臂(ABB、KUKA)的SDK多基于.NET开发,C#可直接调用,避免跨语言通信延迟;多线程管理成熟(Task。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1146

算法练习——Tricky and Clever Password

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

zm1_1zm 971

dify案例-基于Dify打造智能合同审查助手:零代码搭建工作流全指南

Dify的工作流(Workflow)功能是一个可视化流程编排工具,允许用户通过拖拽节点的方式构建复杂的AI应用。与简单的问答应用不同,工作流支持多步骤任务处理、条件分支、并行执行等高级功能,非常适合合同审查这类结构化任务。可视化编排:无需编写代码,通过拖拽连接节点即可构建复杂流程多模型协作:可在不同节点使用最适合的AI模型灵活集成:支持知识库检索、条件判断、API调用等多种节点类型迭代优化:可随时测试和调整单个节点,不影响整体流程可视化搭建:无需编码经验,拖拽式构建复杂审查流程灵活扩展。

weixin_44245188的博客 1939

步科触摸屏编程

1.首先官网上下载kinco软件,然后再安装驱动,安装的方式是需要两个文件。把两个文件放到driver文件夹下面,然后设备管理器右键更新,手选driver文件夹,自动安装即可。 步科触摸屏驱动文件下载地址 2.按照步科触摸屏使用手册一步一步来建立工程 Kinco HMIware使用手册下载地址 登录界面 涉及到的是页面切换,用的是login window,然后只留下等级输入那个

MAYBE的博客 2万+

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

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

Cloth的博客 566

Mathcad在LLC谐振变换器设计中的公式推导实战

本文通过Mathcad软件,详细演示了LLC谐振变换器设计的核心公式推导实战。文章阐述了如何利用Mathcad作为“会思考的草稿纸”,从定义基本参数、应用基波近似法(FHA)模型,到逐步推导电压增益公式及确定工作边界频率(fmin, fmax),并展示了如何通过动态参数扫描进行优化设计,帮助电源工程师高效、直观地完成理论计算,为后续仿真与实现奠定坚实基础。

q1w3e5r7t9y的博客 297

codeforces 30E 蓝桥杯 Tricky and Clever Password

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

tanmlh的专栏 3157

SerDes系列之FFE均衡技术

FFE的基本结构可以在RX侧或TX侧实现,其基本工作原理相同:它通过从同一信号源应用适当的延迟来产生多径信号,然后对它们进行线性缩放和组合以消除信道ISI。

一只豌豆象的博客 4245

CLRNet车道线检测模型在Orin Nano Super开发板上的全栈部署与优化实践

本文详细介绍了将CLRNet车道线检测模型部署到NVIDIA Orin Nano Super开发板的全过程。内容包括:1) Orin开发板硬件规格分析;2) JetPack SDK环境配置与Python虚拟环境搭建;3) CLRNet模型架构解析与PyTorch实现;4) 模型转换与TensorRT加速优化方法。通过系统性的环境配置、模型转换和性能优化,为边缘计算场景下的车道线检测应用提供了完整的解决方案,实现了在Orin平台上的高效部署。

huanghm88的专栏 226

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

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

乐着过一辈子的专栏 2846

麒麟服务器操作系统QT系列软件工具手册

对Qt提供的开发工具进行了一系列的优化之后,在日常的修复bug和维护框架的过程中,桌面研发对Qt的基础软件库也进行了部分优化工作,包括qtbase、qtwayland、qtscript、qt4-x11等Qt基础组件,涉及的Qt框架版本主要涉及到5.9和5.12两个版本。qt 的翻译,是由 ts 文件生成 qm 文件然后进行翻译,国产操作系统上qt 的翻译是由单独的qttranslations包中进行维护,其次部分汉化问题也是qt组件维护工作的一部分,qt的翻译机制如图4-7所示。

太极淘的博客 543

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝桥杯 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

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

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

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

算法训练 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、付费专栏及课程。

余额充值