zoukankan
html css js c++ java
[8.16考试] 玩具
Problem
儿时的玩具总是使我们留恋,当小皮还是个孩子的时候,对玩具更是情有独钟。小皮是一个兴趣爱好相当广泛且不专一的人,这这让老皮非常地烦恼。也就是说,小皮在不同时刻所想玩的玩具总是会不同,而有心的老皮也会尽量 满足他的要求,帮他买一些新玩具。 一开始小皮有一个长度为N的玩具序列 , 小皮的玩具可以用小写字母a,b,c,...,z表示。小皮可能会有q种需求每种需求用一个二元组(x,y)表示,代表小皮在此时最喜欢x这种玩具,他希望老皮帮他买回y个玩具x, 小皮希望知道假如用这y个玩具去**替换原来的玩具**,最多可以产生多长的连续为x的这种玩具序列。 ### 输入格式 第一行一个整数N,代表小皮有N个玩具。 接来下一行一个由小写字母构成的字符串,表示初始的玩具序列。 接下来一个整数q,代表小皮有q种需求。 接下来q行,每一行一个二元组(x,y)。 ### 输出格式 q行,每一行一个答案。 ### 样例输入 5 aabaa 2 a 1 b 2 ### 样例输出 5 3 ### 数据范围:$$N<=2000,q<=3*10^5,1<=y<=N$$ ## Solution N<=2000,可以想到可能是O($n^2$) 的算法。O($n*q$)发现是过不了的, 所以我们想到离线去做。设$f[i][j]$代表从1到i全部变成字母j需要用多少次。$ff[i][j]$代表用i次操作把字母j变成的连续序列最长的长度是多长。 我们只需输出$ff[i][j]$就可以了。然后我们想怎么得出$ff$数组就行了。 我们先跑一遍,把f数组处理出来,接下来枚举左右端点,处理出ff数组 。可以发现需要递推ff数组 $$ff[i][j]=max(ff[i][j],ff[i-1][j]+1)$$ 代码如下 ```cpp #include
#include
#include
#include
using namespace std; int f[2010][30],ff[2010][30],mx[20100]; char s[201010]; int main() { freopen("toy.in","r",stdin); freopen("toy.out","w",stdout); char ss[3]; int n,m,x; cin>>n; scanf("%s",s+1); for(int i=1;i<=n;i++) { int k=s[i]-'a'; for(int j=0;j<26;j++) if(k==j) f[i][j]=f[i-1][j]; else f[i][j]=f[i-1][j]+1; } //cout<
>q; for(int i=1;i<=q;i++) { scanf("%s%d",ss,&x); int k=ss[0]-'a'; printf("%d ",min(n,ff[x][k])); } } ``` ### 博主蒟蒻,可以随意转载,但必须附上原文链接[k-z-j](https://www.cnblogs.com/kzj-pwq/)。
查看全文
相关阅读:
词汇表处理脚本
jLowNote又,我为什么要说又,有bug
于是按照贴吧某同学的指教,把imageViewer里那个愚蠢的语句改了
捉到Bug一只,jLowNote里的
高产赛母猪
我超喜欢Nimbus风格的!
专注写记事本三十年
秒秒钟食言
别再打了,Java和Python,你们其实都是C
电话本写完了,发个1.0吧
原文地址:https://www.cnblogs.com/kzj-pwq/p/9488062.html
最新文章
CSL 的字符串
牛客多校2020 第十场 Identical Trees
Round Corridor CodeForces
codeforces 1200B. Block Adventure(简单模拟)
Shuffle'm Up POJ
Prime Path POJ
Find The Multiple POJ
kmp
beijing
Game
热门文章
Log Files
coprime Sequence
最长回文子串(Mirrored String II)
跑动的圆圈
Make Cents
博弈知识汇总
Catch That Cow(bfs)
打开大图会天元突破的图片查看器
关闭窗口时弹对话框,点否就不关闭——的方法
用了下exe4j,其实还是挺简单的
Copyright © 2011-2022 走看看