P5587 打字练习题目描述R 君在练习打字。有这样一个打字练习网站给定一个范文和输入框会根据你的输入计算准确率和打字速度。可以输入的字符有小写字母、空格和.英文句号输入字符后光标也会跟着移动。输入的文本有多行R 君可以通过换行键来换行换行后光标移动到下一行的开头。R 君也可以按退格键为了方便退格键用表示以删除上一个打的字符并将光标回移一格。特殊的如果此时光标已经在一行的开头则不能继续退格即忽略此时输入的退格键。网站的比较方式遵循以下两个原则逐行比较即对于范文和输入的每一行依次比较不同行之间不会产生影响多余的行会被忽略。逐位比较即对于两行的每一个字符依次比较当且仅当字符相同时才会被算作一次正确否则会被算作错误。计算答案时只统计相同的字符个数。需要注意的是回车键不会被计入正确的字符个数。R 君看到网站上显示他花了TTT秒完成了这次的打字游戏请你计算出他的 KPMKeys per minutes每分钟输入的字符个数答案四舍五入保留整数部分。输入格式R 君会依次告诉你网站的范文他的输入和花费的时间。其中范文和输入将会这样读入给定若干行字符串以单独的一行EOF结束其中EOF不算入输入的文本。最后一行一个整数TTT表示他打字花费了TTT秒。可以参考样例输入输出文件和样例解释辅助理解。输出格式一行一个整数表示 KPM。输入输出样例 #1输入 #1hello world. aaabbbb x EOF heelo world. aaacbbbb yx EOF 60输出 #118说明/提示样例解释第一行的正确字符数为 11。第二行的正确字符数为 6错误的字符c仍会占据一个位置。第三行的正确字符数为 1R 君使用退格键删除了被打错的字符y。数据范围对于20%20\%20%的数据不存在换行键。对于40%40\%40%的数据不存在退格键。对于100%100\%100%的数据T≤103T \leq 10^3T≤103保证每个文本段的总字符数包括换行不超过10510^5105个且总行数不超过10410^4104。我的解答#includecstdio#defineregregisterusingnamespacestd;chars1[200007],s2[200007],ch;//s1表示范文s2表示打字练习输入的字符intcnt1,cnt2;intans;intt;//最后读入的时间intmain(){s1[0]10;s2[0]10;//ASCII码的10就等于\n表示换行符chgetchar();//使用getchar加快速度while(ch!F)//读到F的时候就是结束符EOF的最后一位了所以应该跳出循环{if(ch)//判断是否读入了退格符{if(s1[cnt1]!10)//如果退格符前面不是换行符{cnt1--;//刚刚读入的字符需要删去,把当前序号--}chgetchar();//重新读入一个字符continue;//继续}s1[cnt1]ch;//如果不是换行符那么就存入s1数组chgetchar();//继续读入}//范文读取完毕while((cha||chz)ch!.){chgetchar();}//为了防止读入无用字符我们需要先把范文和实际输入之间的这些字符读取掉while(ch!F)//同上将实际输入存入s2数组{if(ch){if(s2[cnt2]!10){cnt2--;}chgetchar();continue;}s2[cnt2]ch;chgetchar();}cnt1-3;cnt2-3;//由于我们刚刚读入时把EOF也同时存入了s1和s2数组因此我们需要抛弃它们。所以cnt1和cnt2都要--for(reginti1,j1;icnt1jcnt2;)//开始对比s1和s2{if(s1[i]s2[j]s1[i]!10)//如果s1和s2的这个字母相同并且s1的这个字符不是换行符{ans;//正确输入的字符数量}if(s1[i]10)//如果范文需要换行{while(s2[j]!10)//我们需要使读入的字符也跳到换行符{j;}i;//继续对比下一行j;continue;}if(s2[j]10)//同理读入串需要换行也要都跳到下一行{while(s1[i]!10){i;}i;j;continue;}i;j;}scanf(%d,t);//读入耗费的时间printf(%.0lf,(double)ans/(double)t*60);//题目要求四舍五入所以使用printf%.0lf这样就会自动输出四舍五入的数字return0;//Byebye程序 qwq}