字符串专题
2015-10-19 12:41
302 查看
1、字符串还原 restore
老师题解:
可以转化为找到翻转加密的串逆序输出即可,另外2个串肯定满足所有对应第i位字母差(a转为0,b转为1,类推)相同(利用26个字母,k<=6,求出当差绝对值大于6可以对应成小于6的),如果翻转串也满足以上条件,那么原串为回文串。在k>0的情况下满足与其余2个串满足上述条件且差相等或者不满足上述条件即为翻转串,逆序输出,这样只要两两判断1次即可。
由于vijos承受不了大规模数据,n改成10000后枚举顺序和k等等都是不错的方法。
时间复杂度O(n)
我的[程序]:
lock
3 .牛的RP
【问题背景】 小K是一位蔚蓝教主的崇拜者(Orz教主er),有一天,他收到了一封匿名信,信告诉了小K由于他表现出色,得到了一次当面Orz教主的机会,但是要当面 Orz教主可不那么容易,不是每个人都有资格Orz教主的……所以要破解下面一段密文才可以得到相关的信息,信中有提供加密的规则,但是小K觉得这个问题 看似复杂,所以想请你帮忙…… 【问题描述】 一个长度为n的由小写字母组成的字符串s1s2…sn按如下方式加密成3种形式: 1、 将字符串翻转,即s(i)与s(n-i+1)对换。 2、 将字符串中每个字母变为其之后第k个字母,定义z之后的字母为a,0≤k≤6且未知。 3、 将字符串中每个字母变为其之前第k个字母,定义a之前的字母为z,k同2。 例如字符串abcd按上面3种方式加密后,在k=1的情况下为:1、dcba;2、bcde;3、zabc。 现给出信中按以上3种形式分别加密后的3个字符串(不一定按以上顺序),要求还原原来的字符串,并输出告诉小K。 【输入格式】 输入文件restore.in的第1行为一个整数n,表示这个字符串的长度。 下面3行每行3个长度为n的字符串,且保证符合题目要求。 【输出格式】 输出文件restore.out仅包括1行,为还原后的字符串。 【样例输入】 4 zabc dcba bcde 【样例输出】 abcd 【数据规模】 对于10%的数据,输入给出加密字符串的顺序同题目中1、2、3的顺序。 对于20%的数据,n≤5; 对于40%的数据,n≤10; 对于60%的数据,n≤255; 对于100%的数据,n≤10000。 | |
可以转化为找到翻转加密的串逆序输出即可,另外2个串肯定满足所有对应第i位字母差(a转为0,b转为1,类推)相同(利用26个字母,k<=6,求出当差绝对值大于6可以对应成小于6的),如果翻转串也满足以上条件,那么原串为回文串。在k>0的情况下满足与其余2个串满足上述条件且差相等或者不满足上述条件即为翻转串,逆序输出,这样只要两两判断1次即可。
由于vijos承受不了大规模数据,n改成10000后枚举顺序和k等等都是不错的方法。
时间复杂度O(n)
我的[程序]:
program p1851; var s,a,b,c,d:ansistring; m,n,p,i,j,l,la,lb:longint; begin readln(s); read(m); read(n); readln(p); if m=1 then begin l:=length(s); la:=1; lb:=l-1; a:=copy(s,1,la); b:=copy(s,2,lb); end else begin l:=length(s); la:=m-1; lb:=l-m+1; a:=copy(s,1,la); b:=copy(s,m,lb); end; if n=1 then begin for i:=1 to l do if (ord(s[i])>=65) and (ord(s[i])<=90) then s[i]:=lowercase(s[i]) else if (ord(s[i])>=97) and (ord(s[i])<=122) then s[i]:=upcase(s[i]); s:=s+'Immorta1'; inc(l,8); end; if n=2 then begin while pos(b,s)<>0 do begin delete(s,pos(b,s),lb); dec(l,lb); end; c:='1013'; d:='hh4742'; while pos(c,s)<>0 do begin insert(d,s,pos(c,s)); delete(s,pos(c,s),4); inc(l,2); end; end; if n=3 then begin insert(b,s,abs(n-m)); delete(s,la+lb+1,lb); end; for i:=1 to l do for j:=1 to p+1 do write(s[i]); end.
lock
3 .牛的RP
【问题描述】 天苍苍,野茫茫,JSZX的菜鸟们来到OI牧场旅游,看到了好多好多的牛。OI牧场所有的牛都觉得自己的Rp最高(简称RP牛),为此他们常争论不休。于是,他们让JSZX的菜菜们用最最朴素的方法找出这只RP牛。 经过讨论,最菜的mmk想出了最朴素的方法: 我们要以cows的名字为线索,来找出RP牛。 首先,得到n头牛的名字清单(每头牛的名字是一个仅包含小写字母的字符串,且这些牛的读写方式比较特殊—从右到左),然后对每头牛进行检验,检验按照牛的读写方式进行。规则如下: 1.Rp 牛的名字中必须有子串“jszxoier” 2.将名字中的每个“cow”的替换为“bird”。 3.计算Rp值:A为名字中子串“r”的个数; B为名字中子串“p”的个数; C为名字中字串“rp”的个数; Rp值即为5×A+5×B+20×C。 最后输出RP牛的名字,若有多个RP牛,则输出名字最短的那个。 假如你也是牛中一员,尽管你很不屑这样的水题,但是,你很想到RP牛那里分点Rp,所以你决定解决这道题,并算出RP牛的Rp是多少。 【输入】 第一行,一个数n(n<=3000)。 接下来的n行,每行一个字符串,长度<=600,数据保证存在RP牛。 【输出】 共两行 第一行为RP牛的名字 第二行为RP牛的Rp值 【样例输入】 8 reioxzsjzmy mmk jwc zxf jwc wangwei xcy yuhc 【样例输出】 reioxzsjzmy 5 | ||
相关文章推荐
- Codeforces 574 A. Bear and Elections
- 机器学习:实例1--推荐系统架构
- 你可能不知道的 Linux 命令行网络监控工具
- USACO-1.3:Combination Lock
- 单链表之判断一个单链表中是否有环
- oracle-sql-union用法
- 日报2015/10/19(第一行代码读书笔记)
- ubuntu 14.04 安装java8
- 【C++】枚举量注意
- Android DownloadManager下载进度查询(系列3)
- 数据库笔试题
- 黑马程序员——简单数据存储
- ROC曲线
- Ubuntu上安装Node.js
- 黑马程序员——Java集合
- 随手记UIKit Dynamics
- JSP中正则表达式用法实例
- 我始终相信努力奋斗的意义
- 四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps
- SYSAUX表空间过大处理