您的位置:首页 > 其它

字符串专题

2015-10-19 12:41 302 查看
1、字符串还原 restore

【问题背景】

小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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: