题解 P2366 【yyy2015c01的IDE之Watches】
这个题目处理不难,但是这个读入真是坑爹啊!
说说我的经历:
代码没问题,scanf提交,MLE。下载数据,什么玩意1.20s,1ms都不用就出结果了,这……
cin提交,WA3个点,\n出的乱子
cin.get以及getchar提交,MLE……
终于,AC喽:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <map>
using namespace std;
map <string, int> mp;
char ch;
int value = 0;
string x = "", f = "";
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i++)
{
x = "";
value = 0;
f = "";
while(cin >> ch && ch != '=')
{
x += ch;
}
while(cin >> ch)//这里坑人啊!!!
{
if(ch != '+' && ch != ';')
{
f += ch;
}
else
{
//string转int,stoi函数可以,但是嘛……调用函数费时间哦
if(f[0] >= '0' && f[0] <= '9')
{
int q = 0, len = f.length() - 1;
for(int i = 0; i <= len; i++)
{
q = (q << 1) + (q << 3) + (f[i] ^ 48);
}
value += q;
}
else
{
value += mp[f];
}
f = "";
}
if(ch == ';')//这里不加会获得开心的25分哦
{
break;
}
}
mp[x] = value;
}
for(map <string, int>::iterator it = mp.begin(); it != mp.end(); ++it)
{
if(it -> second != 0)
{
cout << it -> first << " " << it -> second << endl;
}
}
return 0;
}
那说下思路:
先用while读前面的,一直读到=就停止(那什么黑名单字符集貌似有问题),然后继续while读值,如果说不是+或者不是末尾的;就加起来,如果是就判断是变量还是数字!是数字string转int,不然就加这个变量的值
map大法好!
9ms
求过和赞