【洛谷P5587】打字练习

【P5587】打字练习

【废话】首先,作为我练习字符串的一道题,很自然的意料之中的遇到了瓶颈

【前置知识】

  • 字符的输入
    •   久远的记忆让我以为 gets 还能用,于是就RE了,后来又用scanf("%[^\n]",s);,但是由于没有熟练掌握,换为getchar
    •         getchar一次只能进行一个字符的读入,因此可以每次判断读入内容后放进字符组里

【解题思路】

  1. 针对于每一组字符都存在一个stack
  2. 比较时候,要先将stack中的字符先装进另一个临时栈中
  3. 注意<的处理

【遇到的坑】

  • 若只出题人把范文也加了退回

【我的若只CODE】

    

实现代码


#include<bits/stdc++.h>
using namespace std;
char s;
stack<char> s1[4001];
long long ans;
int cnt;
signed main()
{
	cnt=1;
	while(1)
	{
		s=getchar();
		if(s=='F')
		{
			break;
		}
		else if(s=='\n')
		{
			cnt++;
		}
		else if(s=='<' and !s1[cnt].empty())
		{
				s1[cnt].pop();
		}
		else if((s>='a' and s<='z') or s=='.' or s==' ')
		{
			s1[cnt].push(s);
		}
	}
	int id=0;
	while(1)
	{
		stack<char> t1,t2,s2;
		while(1)
		{
			s=getchar();
			if(s=='F')
			{
				break;
			}
			else if(s=='\n')
			{
				break;
			}
			else if(s=='<' and !s2.empty())
			{
				s2.pop();
			}
			else if((s>='a' and s<='z') or s=='.' or s==' ')
			{
				s2.push(s);
			}
		}
		if(s=='F')
		{
			break;
		}
		else 
		{
			while(!s1[id].empty())
			{
				t1.push(s1[id].top());
				s1[id].pop();
//				cout<<t1.top()<<endl;
			}
			id++;
			while(!s2.empty())
			{
				t2.push(s2.top());
				s2.pop();
//				cout<<t2.top()<<endl;
			}
			while(!t1.empty() and !t2.empty())
			{
				if(t1.top()==t2.top())
				{
//					cout<<t1.top()<<" "<<t2.top()<<endl;
					ans++;
				}
//				cout<<"^^^"<<t1.top()<<" "<<t2.top()<<endl;
				t1.pop();
				t2.pop();
			}
		}
	}
	double io;
	cin>>io;
	cout<<int(ans*60.0/io+0.5);
}
posted @ 2024-09-08 22:45  Jucex  阅读(5)  评论(0编辑  收藏  举报