第六周 字符串处理_第1页
第六周 字符串处理_第2页
第六周 字符串处理_第3页
第六周 字符串处理_第4页
第六周 字符串处理_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六讲字符串处理ACM算法与程序设计一个简单的字符串操作的例子#include<string.h>#include<stdio.h>charstrl[]=“Thequickbrowndogjumpsoverthelazyfox”;charstr2[50]=“TheQUICKbrowndogJumpsoverthelazyfox”;charstr3[40]=“TheQUICKbrowndogJumpsoverthelazyfox”;//错误:字符串共有43个字符,需要一个长度至少为44的字符串变量存储。//易忽略在字符串的末尾要添加表示结束的额外标志字符’/0’。charstr4[50];voidmain(void){intresult;str4=“TheQUICKbrownDOGjumpsoverthelazyfox”;//错误:不能将一个字符串常量赋值给另一个字符串变量。str4=str2;//错误:不能将一个字符串变量赋值绘另一个字符串变量str4=str1;//错误:不能将一个字符串变量赋值给另一个字符串变量printf(“Comparestrings:\n\t%s\n\t%s\n\n”,strl,str2);}2LookandSay

1、链接地址2、题目内容Thelookandsaysequenceisdefinedasfollows.Startwithanystringofdigitsasthefirstelementinthesequence.Eachsubsequentelementisdefinedfromthepreviousoneby"verbally"describingthepreviouselement.Forexample,thestring122344111canbedescribedas"one1,two2's,one3,two4's,three1's".Therefore,theelementthatcomesafter122344111inthesequenceis1122132431.Similarly,thestring101comesafter1111111111.3InputTheinputconsistsofanumberofcases.Thefirstlinegivesthenumberofcasestofollow.Eachcaseconsistsofalineofupto1000digits.OutputForeachtestcase,printthestringthatfollowsthegivenstring.SampleInput3122344111111111111112345SampleOutput1122132431101111213141543、解题思路本题是处理重复子串的问题。虽然输入的都是数字,但应当把它们当成字符串处理。由于本题时限一秒,每个字符串的长度多达1000位,所以,不好的算法容易超时。scanf和printf所用的时间大大少于cin和cout所消耗的时间。由于本题需要频繁输出,采用cout则会超过一秒;但使用printf则不会超过一秒。这点是ACM竞赛中节约时间的赏识。一般地,由于cin和cout调试很方便,所以调度期间使用它们,但是提交判题系统后,如果发现超时,可尝试将cin和cout改为scanf和printf,看看是不是由于输入输出过于频繁而导致的。54、参考程序#include<stdio.h>#include<string.h>intmain(){ chars[1001],t; intc,i,j,n,len,temp; scanf("%d",&n); for(i=0;i<n;i++) { scanf("%s",s); c=0; t=s[0]; temp=0; len=strlen(s);64、参考程序 for(j=0;j<len;j++) { if(s[j]==t) { temp++; if(j==len-1) printf("%d%c",temp,t); } else { printf("%d%c",temp,t); t=s[j]; temp=1; if(j==len-1) printf("%d%c",temp,t); } } printf("\n"); } return0;}7Abbreviation1、链接地址2、题目内容WhenaLittleWhitemeetsanotherLittleWhite:LittleWhiteA:(Surprised)!LittleWhiteB:?LittleWhiteA:YouLittleWhiteknow"SHDC"?Sounbelievable!LittleWhiteB:Youarelittlewhite!Littlewhiteisyou!Whatis"SHDC"youaretalkingabout?LittleWhiteA:Wait...Imean"SuperHard-discDriveCooler".LittleWhiteB:Imean"SpadeHeartDiamondClub"...Ducktalkswithchicken-_-//LittleWhiteA:Duck...chicken...faint!8------quotefromqmdofSpade6inCC98forum.Sometimes,wewritetheabbreviationofaname.ForexampleIBMistheabbreviationforInternationalBusinessMachines.Anameusuallyconsistsofoneormorewords.Awordbeginswithacapitalletter('A'-'Z')andfollowedbyzeroormorelower-caseletters('a'-'z').Theabbreviationforanameisthewordthatconsistsofallthefirstlettersofthewords.Now,youaregiventwonamesandaskedtodecidewhethertheirabbreviationsarethesame.9InputStandardinputwillcontainmultipletestcases.ThefirstlineoftheinputisasingleintegerTwhichisthenumberoftestcases.AnditwillbefollowedbyTconsecutivetestcases.Therearefourlinesforeachcase.ThefirstlinecontainsanintegerN(1<=N<=5),indicatingthenumberofwordsinthefirstname.Thesecondlineshowsthefirstname.ThethirdlinecontainsanintegerM(1<=M<=5),indicatingthenumberofwordsinthesecondname.Thefourthlineshowsthesecondname.Eachnameconsistsofseveralwordsseparatedbyspace.Lengthforeverywordislessthan10.Thefirstletterforeachwordisalwayscapitalandtherestonesarelower-case.10OutputResultsshouldbedirectedtostandardoutput.Theoutputofeachtestcaseshouldbeasingleline.Iftwonames'abbreviationsarethesame,output"SAME",otherwiseoutput"DIFFERENT".11SampleInput34SuperHarddiscDriveCooler4SpadeHeartDiamondClub3ShenGuangHao3ShuaiGeHao3CaiPiaoGe4CPCSSampleOutputSAMESAMEDIFFERENT123、解题思路本题是比较两个缩写词是否相同,而缩写词又是从一个包含多个单词的名字中合成的。每次读入一个单词,然后取出它的第一个单词,连接在字符串上,就组成一个缩写词。本题的难点在单词的读取控制上,对于输入数据的控制,是ACM竞赛中考查的一个重要方面。另外,大家可以试试,使用printf输出比使用cout输出快很多。134、参考程序#include<stdio.h>#include<string.h>intmain(){ chars[11],ssa[6],ssb[6]; inti,j,t,n; scanf("%d",&t); for(i=0;i<t;i++) { scanf("%d",&n); for(j=0;j<n;j++) { scanf("%s",s);ssa[j]=s[0];//只取首字母 } ssa[j]='\0';//作字符串处理 scanf("%d",&n); for(j=0;j<n;j++) { scanf("%s",s);ssb[j]=s[0]; } ssb[j]='\0'; if(strcmp(ssa,ssb)==0)printf("SAME\n"); elseprintf("DIFFERENT\n"); } return0;}14Caesar密码

SouthCentralUSA2002Description

JuliusCaesar生活在充满危险和阴谋的年代。为了生存,他首次发明了密码,用于军队的消息传递。假设你是Caesar军团中的一名军官,需要把Caesar发送的消息破译出来、并提供给你的将军。消息加密的办法是:对消息原文中的每个字母,分别用该字母之后的第5个字母替换(例如:消息原文中的每个字母A都分别替换成字母F),其他字符不变,并且消息原文的所有字母都是大写的。

密码字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ

原文字母:VWXYZABCDEFGHIJKLMNOPQRSTU

15Input

最多不超过100个数据集组成。每个数据集由3部分组成:

起始行:START

密码消息:由1到200个字符组成一行,表示Caesar发出的一条消息

结束行:END

在最后一个数据集之后,是另一行:ENDOFINPUTOutput

每个数据集对应一行,是Caesar的原始消息。16SampleInput

STARTNSBFW,JAJSYXTKNRUTWYFSHJFWJYMJWJXZQYTKYWNANFQHFZXJXENDSTARTNBTZQIWFYMJWGJKNWXYNSFQNYYQJNGJWNFSANQQFLJYMFSXJHTSINSWTRJENDSTARTIFSLJWPSTBXKZQQBJQQYMFYHFJXFWNXRTWJIFSLJWTZXYMFSMJENDENDOFINPUTSampleOutput

INWAR,EVENTSOFIMPORTANCEARETHERESULTOFTRIVIALCAUSESIWOULDRATHERBEFIRSTINALITTLEIBERIANVILLAGETHANSECONDINROMEDANGERKNOWSFULLWELLTHATCAESARISMOREDANGEROUSTHANHE17问题分析问题需要将密码消息中的每个字母分别进行相应的变换。关键之处是识别输入数据中的消息行、读入消息行的数据。scanf函数使用输入字符串时,每个字符串中不能有空格。gets函数一次可读入一行,但有可能会导致warningmessagefgets(str,sizeofstr,stdin)=gets(str)18解密时,需将消息中单词的字符串作为普通数组,一次变换其中每个字母。需用以下几个字符串处理函数:gets:读入一行字符串,允许包含空格strcmp:识别消息行的start和endstrlen:计算加密消息中的每个单词的长度19程序#include<stdio.h>#include<string.h>voiddecipher(charmessage[]);voidmain(){charmessage[201];gets(message);while(strcmp(message,“START”==0){decipher(message);printf(“%s\n”,message);gets(message);}return;}20voiddecipher(charmessage[]){charplain[27]=“VWXYZABCDEFGHIJKLMNOPQRSTU”;charcipherEnd[201];inti,cipherLen;gets(message);cipherLen=strlen(message);for(i=0;i<cipherLen;i++)if(message[i]>=’A’&&message[i]<=‘Z’)message[i]=plain[message[i]–‘A’];gets(cipherEnd);return;}21487-3279

EastCentralNorthAmerica1999Description

企业喜欢用容易被记住的电话号码。让电话号码容易被记住的一个办法是将它写成一个容易记住的单词或者短语。例如,你需要给滑铁卢大学打电话时,可以拨打TUT-GLOP。有时,只将电话号码中部分数字拼写成单词。当你晚上回到酒店,可以通过拨打310-GINO来向Gino's订一份pizza。让电话号码容易被记住的另一个办法是以一种好记的方式对号码的数字进行分组。通过拨打必胜客的“三个十”号码3-10-10-10,你可以从他们那里订pizza。

22电话号码的标准格式是七位十进制数,并在第三、第四位数字之间有一个连接符。电话拨号盘提供了从字母到数字的映射,映射关系如下:

A,B,和C映射到2

D,E,和F映射到3

G,H,和I映射到4

J,K,和L映射到5

M,N,和O映射到6

P,R,和S映射到7

T,U,和V映射到8

W,X,和Y映射到9

23Q和Z没有映射到任何数字,连字符不需要拨号,可以任意添加和删除。TUT-GLOP的标准格式是888-4567,310-GINO的标准格式是310-4466,3-10-10-10的标准格式是310-1010。

如果两个号码有相同的标准格式,那么他们就是等同的(相同的拨号)

你的公司正在为本地的公司编写一个电话号码薄。作为质量控制的一部分,你想要检查是否有两个和多个公司拥有相同的电话号码。24Input

输入的格式是,第一行是一个正整数,指定电话号码薄中号码的数量(最多100000)。余下的每行是一个电话号码。每个电话号码由数字,大写字母(除了Q和Z)以及连接符组成。每个电话号码中只会刚好有7个数字或者字母。Output

对于每个出现重复的号码产生一行输出,输出是号码的标准格式紧跟一个空格然后是它的重复次数。如果存在多个重复的号码,则按照号码的字典升序输出。如果输入数据中没有重复的号码,输出一行:

Noduplicates.

25SampleInput124873279ITS-EASY888-45673-10-10-10888-GLOPTUT-GLOP967-11-11310-GINOF101010888-1200-4-8-7-3-2-7-9-487-3279SampleOutput310-10102487-32794888-4567326问题分析关键是判断输入的电话号码中是否有重复号码解决方法:(1)将各种电话号码表示转换成标准表示——一个长度为8的字符串,前3个字符是数字、第4个字符是‘一’、后4个字符是数字。(2)根据电话号码的标准表示,搜索重复的电话号码。办法是对全部的电话号码进行排序,这样相同的电话号码就排在相邻的位置。输出重复的电话号码时,按照号码的字典升序进行输出。27解决方案用一个二维数组telNumbers[100000][9]来存储全部的电话号码。每一行存储一个电话号码的标准表示。每读入一个电话号码.首先将其转换成标准表示.然后存储到二维数组telNumbers中。全部电话号码都输入完毕后.将数组telNumbers作为一个一维数组。其中每个元素是一个字符串.用C/C++提供的函数模板sort对其进行排序。用字符串比较函数strcmp比较telNumbers中相邻的电话号码.判断是否有重复的电话号码,并计算重复的次数。28#include<stdio.h>#include<stdlib.h>#include<string.h>charmap[]=“22233344455566677778889999”;//map表示从电话拨号盘的字母到数字的映射关系:map[j]表示字母j+’A’映射成的数字。charstr[80],telNumbers[100000][9];intcompare(constvoid*eleml,constvoid*elem2){//为函数模扳sort定义数组元素的比较函数strcmp查找重复的电话号码return(strcmp((char*)eleml,(char*)elem2));};29voidstandardizeTel(intn){Intj,k;j=k=-1;while(k<8){j++;if(str[j]==‘-’)continue;k++;if(k==3){telNumbers[n][k]=‘-’;k++;}if(str[j]>=‘A’&&str[j]<=‘Z’){telNumbers[n][k]=map[str[j]-’A’];continue;};telNumbers[n

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论