noi题库(noi.openjudge.cn) 1.7编程基础之字符串T21——T30
T21:单词替换
描述
输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。
输入
输入包括3行,
第1行是包含多个单词的字符串 s;
第2行是待替换的单词a(长度 <= 100);
第3行是a将被替换的单词b(长度 <= 100).
s, a, b 最前面和最后面都没有空格.
输出
输出只有 1 行,将s中所有单词a替换成b之后的字符串。
样例输入
You want someone to help you
You
I
样例输出
I want someone to help you
样例
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char s[],a[],b[];
string f[];
bool v[];
int main()
{
gets(s);gets(a);gets(b);
int k=,l=strlen(s);
for(int i=;i<l;i++)
{
if(s[i]!=' ')
f[k]+=s[i];
else k++;
}
for(int i=;i<=k;i++)
{
if(f[i]==a) cout<<b<<' ';
else cout<<f[i]<<' ';
}
}
T22 紧急措施
描述
近日,一些热门网站遭受黑客入侵,这些网站的账号、密码及email的数据惨遭泄露。你在这些网站上注册若干账号(使用的用户名不一定相同),但是注册时使用了相同的email。你此时拿到了那份泄露的数据,希望尽快将自己的密码更改。策略如下:根据email找到你的用户名和密码,然后更改密码。更改的规则为:小写和大写交换,非字母字符保持不变。
输入
第一行为你的email地址,长度不超过50个字符且只包含字母、数字和‘@’符号。
第二行为账号数N,N(0 < N < 10000)。
接下来N行,每行表示一个账号,格式为:
用户名 密码 email
它们之间用单个空格分开。用户名、密码、email均不含空格,且长度不超过50个字符。
输出
有若干行,每行为你的一个账号,包括:你的账号,修改后的密码(之间用单个空格分隔)。
如果没有你的账号,则输出empty。
样例输入
样例输入1:
abc@pku.edu.cn helloKitty iLoveCats abc@pku.edu.cn
maya2012 cplusplus@exam.com
KittyCat 5iKitty abc@pku.edu.cn
program password teacher@exam.com
whoAmi Feb.$ abc@pku.edu.cn 样例输入2:
abc@pku.edu.cn maya2012 cplusplus@exam.com
样例输出
样例输出1:
helloKitty IlOVEcATS
KittyCat 5IkITTY
whoAmi fEB.$ 样例输出2:
empty
样例
#include<cstring>
#include<iostream>
using namespace std;
string me,usename,password,email;
int n;
bool ok;
int main()
{
cin>>me;cin>>n;
for(int i=;i<=n;i++)
{
cin>>usename>>password>>email;
if(me==email)
{
ok=true;
cout<<usename<<' ';
for(int j=;j<password.size();j++)
if(password[j]>='a'&&password[j]<='z') cout<<char(password[j]-);
else if(password[j]>='A'&&password[j]<='Z') cout<<char(password[j]+);
else cout<<password[j];
cout<<endl;
}
}
if(!ok) cout<<"empty";
}
T23 过滤多余的空格
描述
一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
输入
一行,一个字符串(长度不超过200),句子的头和尾都没有空格。输出过滤之后的句子。
样例输入
Hello world.This is c language.
样例输出
Hello world.This is c language.
样例
每相邻连个判断一次,若相邻两个都是空格,则删除后面的,删除可以通过bool实现
#include<cstring>
#include<iostream>
#include<cstdio>
using namespace std;
char a[];
bool b[];
int main()
{
gets(a);
for(int i=;i<strlen(a);i++)
if(a[i]==' '&&a[i+]==' ') b[i+]=true;//true代表为多余的空格
for(int i=;i<strlen(a);i++)
{
if(b[i]) continue;
cout<<a[i];
}
}
T24 单词的长度
描述
输入一行单词序列,相邻单词之间由1个或多个空格间隔,请对应地计算各个单词的长度。
注意,如果有标点符号(如连字符,逗号),标点符号算作与之相连的词的一部分。没有被空格间开的符号串,都算作单词。
输入
一行单词序列,最少1个单词,最多300个单词,单词之间用至少1个空格间隔。单词序列总长度不超过1000。
输出
依次输出对应单词的长度,之间以逗号间隔。
注意中间可能有相连的好几个空格,排除方法参见下方T25题解
样例输入
She was born in -- and from Beijing city.
样例输出
,,,,,,,,
样例
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char a[];
int s;
int main()
{
gets(a);
int l=strlen(a);
for(int i=;i<l;i++)
{
if(a[i]!=' ') s++;
else if(a[i]==' '&&a[i-]!=' ') //排除掉多个空格相连的情况
{
cout<<s<<',';
s=;
}
}
cout<<s;
}
T25 最长最短单词
描述
输入1行句子(不多于200个单词,每个单词长度不超过100),只包含字母、空格和逗号。单词由至少一个连续的字母构成,空格和逗号都是单词间的间隔。
试输出第1个最长的单词和第1个最短单词。
输入
一行句子。
输出
两行输出:
第1行,第一个最长的单词。
第2行,第一个最短的单词。
样例输入
I am studying Programming language C in Peking University
样例输出
Programming
I
样例
如果所有单词长度相同,那么第一个单词既是最长单词也是最短单词。
注意中间可能有相连的好几个空格或逗号
确定一个单词,排除相连的几个空格或逗号的干扰的方法:若是2个单词之间的空格,则满足(a[i]==' '||a[i]==',')&&(a[i-1]!=' '&&a[i-1]!=','),即这一位是空格或逗号,上一位既不是空格,又不是逗号,本方法同样适用T24
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char a[];
int s;
int max_len,max_num,min_len=,min_num;//分别代表含义:最长单词的长度,最长单词是第几个单词,最短单词的长度,最短单词是第几个单词
string f[];//存储断开的单词
int main()
{
gets(a);
int k=;//要存储第几个单词
int l=strlen(a);
for(int i=;i<l;i++)
{
if(a[i]!=' '&&a[i]!=',') f[k]+=a[i],s++;//s代表当前单词长度
else if((a[i]==' '||a[i]==',')&&(a[i-]!=' '&&a[i-]!=','))
{
if(s>max_len) {max_len=s;max_num=k;}
if(s<min_len) {min_len=s;min_num=k;}
s=;
k++;
}
}
if(s>max_len) {max_len=s;max_num=k;}//由于只循环到strlen(a)-1,所以最后一个单词在上述循环中是无法被记录的
if(s<min_len) {min_len=s;min_num=k;}
cout<<f[max_num]<<endl<<f[min_num];
}
T26:字符串最大跨距
- 描述
- 有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10。想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止点之间的字符数目)。如果没有满足条件的S1,S2存在,则输出-1。
- 例如,S = "abcd123ab888efghij45ef67kl", S1="ab", S2="ef",其中,S1在S中出现了2次,S2也在S中出现了2次,最大跨距为:18。
- 输入
- 三个串:S1, S2, S3,其间以逗号间隔(注意,S1, S2, S3中均不含逗号和空格);
- 输出
- S1和S2在S最大跨距;若在S中没有满足条件的S1和S2,则输出-1。
样例输入
abcd123ab888efghij45ef67kl,ab,ef
样例输出
样例
特别注意字符串不交叉
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char a[],b[],c[],t[];
char s[];
int p,la,lb,lc,first,endd;
int find(int k,int w)
{
int j=,i=k,lt;
if(w==)
{
lt=lb;
for(int r=;r<=lb;r++) t[r]=b[r];
}
else
{
lt=lc;
for(int r=;r<=lc;r++) t[r]=c[r];
}
for(;i<=la,j<=lt;i++,j++)
if(a[i]!=t[j]) return ;
if(j-!=lt) return ;
return k;
}
int main()
{
cin>>s;
int ls=strlen(s);
for(int i=;i<ls;i++)/输入一整行,再断开
{
if(s[i]==',') p++;
else if(!p) a[++la]=s[i];
else if(p==) b[++lb]=s[i];
else c[++lc]=s[i];
}
for(int i=;i<=la;i++)
{
if(a[i]==b[]&&!first) first=find(i,);//只需要出现的第一个位置,所以!first时才执行
if(a[i]==c[]) endd=max(endd,find(i,));//需要最后一个位置,所以要取大 }
if(first==||endd==||first+lb>endd) cout<<-;//first+lb>endd,交叉的情况以及first>endd的情况都是-1
else
{
first+=lb;//first变成最大跨距中的第一个位置
cout<<endd-first;//endd为最大跨距中的最后一个位置的后一个。例:字符串abcde中找ab、de,first开始=1,+lb=3,endd=4,ans=end-first=1
}
}
两大错误:1、没认真读好题,题目里说的是检测条件是s1在s2左边,且不交叉,不是输入字符串的本就具备的条件
2、处理endd时,没加max,忽略了find函数可能返回0,直接赋值有可能用0盖过原来的值
- T27 单词翻转
- 描述
输入一个句子(一行),将句子中的每一个单词翻转后输出。
- 输入
- 只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。
- 输出
- 翻转每一个单词后的字符串,单词之间的空格需与原文一致。
样例输入
hello world
样例输出
olleh dlrow
样例
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char a[],b[];
int main()
{
gets(a);
int la=strlen(a);
for(int i=;i<la;i++)
{
if(a[i]==' ')
{
for(int j=b[];j>;j--) cout<<b[j];//若多个空格相连,b[0]=0,不会有输出
b[]=;
cout<<' ';
}
else b[++b[]]=a[i];
}
for(int j=b[];j>;j--) cout<<b[j];//若最后一个但此后面没有空格,执行此句输出
}
T28 单词倒排
描述
编写程序,读入一行英文(只包含字母和空格,单词间以单个空格分隔),将所有单词的顺序倒排并输出,依然以单个空格分隔。
输入
输入为一个字符串(字符串长度至多为100)。
输出
输出为按要求排序后的字符串。
样例输入
I am a student
样例输出
student a am I
样例
法1:将T27的代码第一重循环改为逆序即可
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
char a[],b[];
int main()
{
gets(a);
int la=strlen(a);
for(int i=la-;i>=;i--)
{
if(a[i]==' ')
{
for(int j=b[];j>;j--) cout<<b[j];
b[]=;
cout<<' ';
}
else b[++b[]]=a[i];
}
for(int j=b[];j>;j--) cout<<b[j];
}
1
法2:开一个字符二维数组,单个字符单个字符的读入,忽略空格以单词的形式存储,再倒着循环第一维输出每个单词和一个空格
#include<iostream>
using namespace std;
int main()
{
int i;
char a[][];
i=;
while(cin>>a[i])i++;
for(i--;i>=;i--)
cout<<a[i]<<' ';
return ;
}
2
T29 ISBN号码
描述
每一本正式出版的图书都有一个ISBN号码与之对应,ISBN码包括9位数字、1位识别码和3位分隔符,其规定格式如“x-xxx-xxxxx-x”,其中符号“-”是分隔符(键盘上的减号),最后一位是识别码,例如0-670-82162-4就是一个标准的ISBN码。ISBN码的首位数字表示书籍的出版语言,例如0代表英语;第一个分隔符“-”之后的三位数字代表出版社,例如670代表维京出版社;第二个分隔之后的五位数字代表该书在出版社的编号;最后一位为识别码。
识别码的计算方法如下:
首位数字乘以1加上次位数字乘以2……以此类推,用所得的结果mod 11,所得的余数即为识别码,如果余数为10,则识别码为大写字母X。例如ISBN号码0-670-82162-4中的识别码4是这样得到的:对067082162这9个数字,从左至右,分别乘以1,2,…,9,再求和,即0×1+6×2+„„+2×9=158,然后取158 mod 11的结果4作为识别码。
你的任务是编写程序判断输入的ISBN号码中识别码是否正确,如果正确,则仅输出“Right”;如果错误,则输出你认为是正确的ISBN号码。
输入
只有一行,是一个字符序列,表示一本书的ISBN号码(保证输入符合ISBN号码的格式要求)。输出共一行,假如输入的ISBN号码的识别码正确,那么输出“Right”,否则,按照规定的格式,输出
正确的ISBN号码(包括分隔符“-”)。
样例输入
样例 #:
--- 样例 #:
---
样例输出
样例 #:
Right 样例 #:
---
样例
#include<iostream>
using namespace std;
char a[];
int s;
int main()
{
cin>>a;
int j=;
for(int i=;i<=;i++)
{
if(a[i]=='-') continue;
s+=(a[i]-'')*j++;
}
s%=;
if(s<)
{
if(a[]==char(s+)) cout<<"Right";//数字的值与对应的ascll码相差48
else
{
for(int i=;i<=;i++) cout<<a[i];
cout<<char(s+);
}
}
else
{
if(a[]=='X') cout<<"Right";
else
{
for(int i=;i<=;i++) cout<<a[i];
cout<<'X';
}
}
}
T30 字符环
描述
有两个由字符构成的环。请写一个程序,计算这两个字符环上最长连续公共字符串的长度。例如,字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起,构成一个环;字符串“MADJKLUVKL”的首尾连在一起,构成一个另一个环;“UVKLMA”是这两个环的一个连续公共字符串。
输入
一行,包含两个字符串,分别对应一个字符环。这两个字符串之间用单个空格分开。字符串长度不超过255,且不包含空格等空白符。
输出
输出一个整数,表示这两个字符环上最长公共字符串的长度。
样例输入
ABCEFAGADEGKABUVKLM MADJKLUVKL
样例输出
样例
这是一个环,环的特点是从任何一个位置转一圈都能回到起点,也就是从任何一个位置开始遍历都能把整个字符串遍历一遍。假设有一个字符串a(从0开始),长度为l,我们可以将a复制一遍接到a的后面,这样以0—l-1的任何一个点,长度为l的区域都是整个字符串,这就实现了环向链的转化。
然后就是枚举区间长度,区间起点、终点比较,因为是求最大,所以可以从两个字符串的长度值较小的开始枚举,依次递减,符合要求就输出,结束程序
#include<cstring>
#include<iostream>
using namespace std;
char a[],b[];
int main()
{
cin>>a>>b;
int la=strlen(a),lb=strlen(b);
for(int i=;i<la;i++) a[la+i]=a[i];//断环成链
for(int i=;i<lb;i++) b[lb+i]=b[i];
for(int k=min(la,lb);k>=;k--)//枚举答案可能情况
for(int i=;i<la;i++)//第一个字符串的左端点
{
int za=i+k-;//第一个字符串区间长度为k时的右端点
for(int j=;j<lb;j++)//第二个字符串的左端点
{
int zb=j+k-;//第二个字符串区间长度为k时的右端点
int sa=i,sb=j;
bool flag=true;
while(sa<=za&&sb<=zb)//比较是否公共
{
if(a[sa]!=b[sb])
{
flag=false;
break;
}
else sa++,sb++;
}
if(flag)
{
cout<<k;
return ;
}
}
}
}
noi题库(noi.openjudge.cn) 1.7编程基础之字符串T21——T30的更多相关文章
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- NOI题库 1768最大子矩阵 题解
NOI题库 1768最大子矩阵 题解 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大 ...
- NOI题库 09:图像旋转翻转变换
NOI题库开始的题,也是略水,当然也是大水,所以彼此彼此 09:图像旋转翻转变换 总时间限制: 1000ms 内存限制: 65536kB 描述 给定m行n列的图像各像素点灰度值,对其依次进行一系列操作 ...
- NOI题库-小学奥赛QwQ
今天Loli教育我们让我们来看看NOI题库的奥赛部分,不过,为何是小学的( ⊙ o ⊙ )啊!感觉智商被各种侮辱. 余数相同问题: 描述 已知三个正整数 a,b,c. 现有一个大于1的整数x,将其作为 ...
- noi题库(noi.openjudge.cn) 1.7编程基础之字符串T31——T35
T31 字符串P型编码 描述 给定一个完全由数字字符('0','1','2',-,'9')构成的字符串str,请写出str的p型编码串.例如:字符串122344111可被描述为"1个1.2个 ...
- noi题库(noi.openjudge.cn) 1.5编程基础之循环控制T36——T45
T36 计算多项式的值 描述 假定多项式的形式为xn+xn-1+-+x2+x+1,请计算给定单精度浮点数x和正整数n值的情况下这个多项式的值. 输入 输入仅一行,包括x和n,用单个空格隔开.x在flo ...
- noi题库(noi.openjudge.cn) 1.8编程基础之多维数组T11——T20
T11 图像旋转 描述 输入一个n行m列的黑白图像,将它顺时针旋转90度后输出. 输入 第一行包含两个整数n和m,表示图像包含像素点的行数和列数.1 <= n <= 100,1 <= ...
- noi题库(noi.openjudge.cn) 1.9编程基础之顺序查找T06——T15
T06 笨小猴 描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设maxn是单词 ...
- noi题库(noi.openjudge.cn) 1.9编程基础之顺序查找T01——T05
T01 查找特定元素的值 描述 在一个序列(下标从1开始)中查找一个给定的值,输出第一次出现的位置. 输入 第一行包含一个正整数n,表示序列中元素个数.1 <= n <= 10000.第二 ...
随机推荐
- Android中TextView添加删除线
项目中的需求~~~~ 商城中物品的一个本身价格,还有一个就是优惠价格...需要用到一个删除线. public class TestActivity extends Activity { private ...
- Windows下 maven3.0.4的安装步骤+maven配置本地仓库
简单讲下maven的安装步骤: 1.在安装maven之前,先确保已经安装JDK1.6及以上版本,并且配置好环境变量. 2.下载maven3,最新版本是Maven3.0.4 ,下载地址:http://m ...
- nodejs events模块
var EventEmitter = require('events').EventEmitter; var emitter = new EventEmitter(); console.log(emi ...
- 最新中国菜刀caidao-20160620下载和说明
0x00 中国制造, 黑客之刀 中国菜刀是中国安全圈内使用非常广泛的一款Webshell管理工具,此次老兵大牛进行了更新,界面更加优美,功能更加丰富,有图有真相! 0x01 验证 此次更新还自带了官网 ...
- [css]我要用css画幅画(二)
接着之前的[css]我要用css画幅画(一) , 今天,我又画一个房子,很简单,屋顶.墙壁.门. 现在开始,做得效果都只兼容chrome,所以下面的css3的属性可能只有-webkit-前缀. 我只是 ...
- 搬家至独立博客 http://blog.imzjy.com
欢迎访问 http://blog.imzjy.com
- mysql-mmm 安装配置(双主)
原文地址:mysql-mmm 安装配置 作者:chinaunix1116 MMM即Master-Master Replication Managerfor MySQL(mysql主主复制管理器)关于m ...
- 0007《SQL必知必会》笔记03-汇总与分组数据
1.有些时候需要数据的汇总值,而不是数据本身,比如对某些数据求和.计数.求最大最小值.求平均值,因此就有了5个聚集函数:AVE().COUNT().MAX().MIN().SUM(): (1)求平均值 ...
- 在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式 转载自:http://blog.163.com/smhily_min/blog/static/75206226201092011 ...
- android WebView网页浏览器
组件位置:composite>WebView .xml <WebView android:id="@+id/webview_pipeweb" android:layou ...