题解 P5587 打字练习

Posted randolph68706

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解 P5587 打字练习相关的知识,希望对你有一定的参考价值。

P5587 打字练习

想发一篇较为简洁易懂的题解,代码看起来长,实际上还是很好理解的,而且很多对称着写就行了

一道字符串签到题,比赛的时候小蒟蒻调了一个小时都没调出来一直RE,坑点还是不少的(主要是我太水了)

  1. 听其他题解中说后50%的数据是范文中也有退格键的情况

  2. 边做边判断退格键是不行的,因为可能有多个退格键,删的不止当前的字符(边做边判断似乎也会WA后50%数据),可以用栈

  3. 计算时间t的时候应转为double再除以60,否则t<60时整除60为0,答案除以t会RE

如果使用字符数组的话可以用gets与strlen,但是the `gets‘ function is dangerous and should not be used.,似乎会WA一些点

做了这题对字符串的读入等操作基础还是有所巩固的。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
string a[10005],b[10005];
stack<char> aa,bb;//储存去除退格后的字符
int n,m,cnt,t,al,bl;
int main() {
    for (n=1; ; n++) {
        getline(cin,a[n]);
        if (a[n][0]=='E' && a[n][1]=='O' && a[n][2]=='F' && a[n][3]=='') break;
    }
    for (m=1; ; m++) {
        getline(cin,b[m]);
        if (b[m][0]=='E' && b[m][1]=='O' && b[m][2]=='F' && b[m][3]=='') break;
    }

    for (int i=1; i<n; i++) {
        al=a[i].size(),bl=b[i].size();

        while(!aa.empty()) aa.pop();
        while(!bb.empty()) bb.pop();

        for (int j=0; j<al; j++)
            if (a[i][j]=='<') {
                if (!aa.empty())
                    aa.pop();
            } else aa.push(a[i][j]);//先扫一遍字符串,处理退格,将去除退格后的字符串存入栈
            
        for (int j=0; j<bl; j++) 
            if (b[i][j]=='<') {
                if (!bb.empty())
                    bb.pop();
            } else bb.push(b[i][j]);

        while(aa.size()<bb.size()) bb.pop();
        while(aa.size()>bb.size()) aa.pop();//调为相同长度再比较

        while(!aa.empty()) {
            if (aa.top()==bb.top()) cnt++;//统计答案
            aa.pop(),bb.pop();
        }
    }

    scanf("%d",&t);
    double time=1.0*t/60;
    printf("%d",(int)(cnt/time+0.5));//四舍五入
}

以上是关于题解 P5587 打字练习的主要内容,如果未能解决你的问题,请参考以下文章

金山打字通是这样来的,练习打字有它够了

json 打字稿片段

typescript 打字稿+角度1的启动片段

基于QT的在线打字练习软件助手(C/S模型)good

键盘输入盲打训练, 打字练习,打字游戏 打字教程推荐

CCF NOI 1172 单词数 题解