杭电acm练习题
Day03—— ProblemID=2072
这个写不来于是去搜了下别人的代码,看懂以后我又自己背着写了一次,然后提交。
参考链接:大佬2072代码
意料之外的 果不其然, 第一次提交WrongAnswer了:
错误的代码:
#include <iostream>
#include <sstream>
#include <string>
#include <set>
using namespace std;
int main() {
string word;
string s;
set<string>allWords;
stringstream ss;
while (getline(cin, s)) {
if (s == "#")
break;
ss.str(s);
while (ss >> word && word != "#")
allWords.insert(word);
cout << allWords.size() << endl;
allWords.clear();
}
return 0;
}
不知道是错在哪啊。
用大佬的代码试了一下是可以提交成功的,如下图:
我估计问题就出在我写的对于word判断是否为#那里,所以我用大佬的代码运行试了以下输入:
也就是说,只有单独输入的#才看做程序结束,跟在单词后面的#不作为程序结束的标志。
我改了while那里的判断以后,又把clear提到前面,第二次提交,又是WrongAnswer。
于是我本地运行了一下我第二次提交的代码:
为什么别人的代码运行没问题呢?
经过多次尝试,我发现不是clear位置的问题,而是不能把stringstream ss(s);这句话拆成两句写,本来我是想把他拆成两句创建对象的放在while循环外面,就不用每次循环重新新建浪费时间和空间,在while循环里面只要给他赋值就行了,结果没想到这样会运行不成功。
但我是那么轻易就放弃的人吗?是的,我是。 当然不是。
所以我就试着在一次输出结束后再用stringstream调用一次clear函数,果不其然,运行成功了!如下图:
然后我再去官网提交代码,通过啦!哈哈哈哈哈哈哈~
代码如下:
#include <iostream>
#include <sstream>
#include <string>
#include <set>
using namespace std;
int main() {
string word;
string s;
stringstream ss;
set<string>allWords;
while (getline(cin, s)) {
if (s == "#")
break;
allWords.clear();
ss.str(s);
while (ss >> word)
allWords.insert