精華區beta C_and_CPP 關於我們 聯絡資訊
我的測資看起來都對 但是還是吃了好多WA.... 有沒有人能告訴我一下...錯在哪 謝謝各位大大了<(_ _)> #include<iostream> #include<string> using namespace std; int main() { char ch ; string str=""; long int i,pos=0; while(cin.get(ch)!=NULL){ if(ch==' '||ch=='\n'){ for(i=str.length()-1;i>=pos;i--) cout << str[i]; pos=str.length(); if(ch=='\n') cout << endl; else if(ch==' ') cout << " "; } else{ str+=ch; } } } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.210.209
LPH66:建議不要這樣寫 每個字讀完把字串清掉會比較好 163.32.78.27 05/26
kakashiliu:是要把字串變成""嗎!?140.115.210.209 05/26
kakashiliu:怎麼清阿...我還是失敗耶140.115.210.209 05/27
> -------------------------------------------------------------------------- < 作者: aecho (星空下的鮪魚) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Thu May 26 20:56:11 2005 Q_Q 這一題我也有問題.... 用string的find 覺得很奇怪 會莫名奇妙的暴走... 如 I love You. 就沒問題... 但 hehe , I am a student. 就出現了這鬼玩意... eheha I , a ma Ieduts a ma .tneduts a .tneduts #include <iostream> #include <string> #include <algorithm> using namespace std; int main(){ string m_str; string m_sub; string m_str_main; m_str.reserve(2048); int pos,new_pos; while(getline(cin,m_str) ){ pos = new_pos = 0; m_str_main = m_str + " "; while(pos < m_str.size() ){ pos = m_str_main.find_first_not_of(" ",new_pos); new_pos = m_str_main.find_first_of(" ",pos); if (pos == string::npos) break; if (new_pos != string::npos) m_sub = m_str_main.substr(pos,pos == 0 ? new_pos : new_pos-1); else m_sub = m_str_main.substr(pos); reverse(m_sub.begin(),m_sub.end()); cout << m_sub; } cout << endl; } return 0; } -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.95.107 > -------------------------------------------------------------------------- < 作者: aecho (星空下的鮪魚) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Fri May 27 18:48:09 2005 ※ 引述《kakashiliu (kakashi)》之銘言: : 我的測資看起來都對 : 但是還是吃了好多WA.... : 有沒有人能告訴我一下...錯在哪 : 謝謝各位大大了<(_ _)> : #include<iostream> : #include<string> : using namespace std; : int main() : { : char ch ; : string str=""; : long int i,pos=0; : while(cin.get(ch)!=NULL){ : if(ch==' '||ch=='\n'){ : for(i=str.length()-1;i>=pos;i--) : cout << str[i]; : pos=str.length(); : if(ch=='\n') : cout << endl; : else if(ch==' ') : cout << " "; : } : else{ : str+=ch; : } : } : } 幫你測了一下....覺得你是都死在最後一筆資料.... 如果 最後一筆資料是 I am a student[EOF] 也就是說... 沒 ' '和 '\n' 給你做判斷的話.... 會怎樣.... 這是推測啦 ^^ 至於死在最後一筆資料的推測是 W.A的時間跟我A.C的時間差不多 在0.004秒附近.... 加上 str = "";也測過了.... 測資也都可以 不過就是都W.A .... -- 靜待風帆將起之日 乘風隨夢.... 到那不知名的未知裡.. 探尋....深夜靜謐的想望... 探尋....潛藏心底的自己... -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.196.189
aecho:p.s.我找不到錯誤,突然想到你要不要換個寫法....218.166.196.189 05/27
aecho: 大概就是這樣吧 ^^218.166.196.189 05/27
※ 編輯: aecho 來自: 218.166.85.196 (05/28 01:01)
kakashiliu:所以這樣會死在最後一筆資料就是了@_@ 61.58.184.8 05/28
> -------------------------------------------------------------------------- < 作者: windows2k (代替孟子來懲罰你) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Fri May 27 23:14:06 2005 好久以前寫的,野人獻曝一番,應該沒多大錯誤才對(PE) :O #include <cstdio> #include <cstring> using namespace std; char str[500],str1[500],*p; int count; int main() { while(gets(str)!=NULL) { for(p=strtok(str," "),count=0;p;p=strtok(NULL," "),count++) { if(count) putchar(' '); for(int l=strlen(p)-1;l>=0;l--) putchar(*(p+l)); } putchar('\n'); } return 0; } -- 所以說十賭九輸...唉唉 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.220.139 > -------------------------------------------------------------------------- < 作者: khoguan (Khoguan Phuann) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 00:21:28 2005 ※ 引述《windows2k (代替孟子來懲罰你)》之銘言: : 好久以前寫的,野人獻曝一番,應該沒多大錯誤才對(PE) :O 我也來野人獻曝,改用 C++ 來做。 幾乎都依賴 C++ standard lib 來寫,沒動到腦筋。 分隔的 whitespace 都當做只有一個來處理。 #include <iostream> #include <sstream> #include <string> #include <algorithm> using namespace std; int main() { string inpline; string word; while (getline(cin, inpline)) { istringstream istr(inpline); string outline; while (istr >> word) { reverse(word.begin(), word.end()); outline += word; outline += ' '; } outline[outline.length()-1] = '\n'; cout << outline; } return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.208.168
aecho:剛發現 sstream似乎包含了string這個header 218.166.85.196 05/28
aecho:而且 用C++好像都突破不了0.004秒的限制 >"< 218.166.85.196 05/28
khoguan:突破這個限制就會怎麼樣呢?(我第一次玩ACM)220.130.208.168 05/28
khoguan:剛再試只用cout,不用 string class就可以突破了220.130.208.168 05/28
aahhmm:感謝^^" 218.164.93.166 05/28
> -------------------------------------------------------------------------- < 作者: Fightsea (蜂蜜派) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 04:52:55 2005 恕刪 我這樣寫就accepted了 可是花了0.006秒 難道真的如前面所說 不用string class才能變快嗎? 還有問一下 什麼是Accepted (P.E.)? (很少玩ACM... ) ------------------------------------------------------------------------------ #include <iostream> #include <string> using namespace std; #define swap( x, y ){ char t; t = x; x = y; y = t; } int main() { string temp; do{ cin >> temp; for( int i = 0; i < temp.length()/2; i++ ) swap( temp[i], temp[ temp.length()-1 - i ] ); cout << temp << ( cin.get() != '\n' ? " " : "\n" ); }while( !cin.eof() ); return 0; } ------------------------------------------------------------------------------ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.122.22.174 ※ 編輯: Fightsea 來自: 140.122.22.174 (05/28 04:59)
sekya:輸出格式有錯誤,但答案是正確的221.169.193.182 05/28
Fightsea:原來如此~ 140.122.22.174 05/28
UNARYvvv:presentation error 61.70.137.117 05/28
Fightsea:我想應該是whitespace的關係吧 140.122.22.174 05/28
> -------------------------------------------------------------------------- < 作者: catyun (喵貓~~) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 06:16:09 2005 ※ 引述《Fightsea (蜂蜜派)》之銘言: : 恕刪 : 我這樣寫就accepted了 可是花了0.006秒 : 難道真的如前面所說 不用string class才能變快嗎? : 還有問一下 什麼是Accepted (P.E.)? : (很少玩ACM... ) Accepted 0:00.002 64 前面一海票人都0.000的 要怎樣再快下去啊? #include <iostream> using namespace std; int main() { char buf[512]; int i=0,temp=0; while(cin.get(buf[i])) { if (buf[i]==' ' || buf[i]== '\n') { temp=i; for (--i;i>=0;i--) cout.put(buf[i]); cout.put(buf[temp]); i=0; } else i++; } for (--i;i>=0;i--) cout.put(buf[i]); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.207.198
windows2k:IO改一改就能變快了140.115.220.139 05/28
kakashiliu:原來如此阿...我可能是用到string來存了@_@ 61.58.184.8 05/28
> -------------------------------------------------------------------------- < 作者: khoguan (Khoguan Phuann) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 10:56:03 2005 ※ 引述《catyun (喵貓~~)》之銘言: : ※ 引述《Fightsea (蜂蜜派)》之銘言: : : 我這樣寫就accepted了 可是花了0.006秒 : : 難道真的如前面所說 不用string class才能變快嗎? : : 還有問一下 什麼是Accepted (P.E.)? : : (很少玩ACM... ) : Accepted 0:00.002 64 : 前面一海票人都0.000的 : 要怎樣再快下去啊? : #include <iostream> : using namespace std; : int main() : { : char buf[512]; : int i=0,temp=0; : while(cin.get(buf[i])) : { : if (buf[i]==' ' || buf[i]== '\n') : { : temp=i; : for (--i;i>=0;i--) : cout.put(buf[i]); : cout.put(buf[temp]); : i=0; : } : else : i++; : } : for (--i;i>=0;i--) : cout.put(buf[i]); : return 0; : } 我覺得你寫得很簡潔。速度也不錯。值得學習 :-) 我總共寫了四五種 C++ 版本去測,有 0.004秒,0.002秒,0.000秒 各種結果,發現速度要快,要用 <iostream> 和 <cstring>,不要用 <string>, <sstream> 等其他的 C++ lib. 而且是讀的時候以一行為 單位,寫的時候以一個 word 為單位(先reverse好),而不是一個字元 一個字元讀寫。像是這樣: #include <iostream> #include <cstring> inline void swap(char& a, char& b) { char t = a; a = b; b = t; } int main() { using namespace std; char inpline[1024] = {0}; char c; while (cin.getline(inpline, 1024)) { size_t len = strlen(inpline); char outline[1024] = {0}; int i = 0; while (i < len) { char word[1024] = {0}; int j = 0; while (inpline[i] != ' ' && i < len) word[j++] = inpline[i++]; for (int m = 0, n = j - 1; m < n; ++m, --n) swap(word[m], word[n]); cout << word; if (i >= len) break; while (inpline[i] == ' ' && i++ < len) cout << ' '; } cout << '\n'; } return 0; } 上述的寫法可以正確處理word前後或中間有連續多個 whitespace(ws) 的情形。但是為了簡單起見,ws部份 我就逐一輸出,我想它在評分時的測試資料並沒有連續 多個 ws, 所以沒影響到速度。 但是使用 char array 的缺點就是長度有限,無法像 string class 那樣自由長大。上面的程式碼也沒檢查輸入行超過 1024字元造成 cin fail 的錯誤狀況。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.208.167
aecho:這時間多少啊? 218.166.77.34 05/28
khoguan:我測是 0.000 秒220.130.208.167 05/28
catyun:果然是io的問題啊..我也覺得是慢在IO 59.121.207.198 05/28
aecho:看來string真的很慢啊 Orz 218.166.94.26 05/28
> -------------------------------------------------------------------------- < 作者: aecho (星空下的鮪魚) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 10:49:26 2005 ※ 引述《catyun (喵貓~~)》之銘言: : ※ 引述《Fightsea (蜂蜜派)》之銘言: : : 恕刪 : : 我這樣寫就accepted了 可是花了0.006秒 : : 難道真的如前面所說 不用string class才能變快嗎? : : 還有問一下 什麼是Accepted (P.E.)? : : (很少玩ACM... ) : Accepted 0:00.002 64 : for (--i;i>=0;i--) : cout.put(buf[i]); 看來原提問者應該是缺了這一步吧.... 你的作法跟他最像了 : return 0; : } 還要再快的話 我想不能用cin和cout吧 用printf和scanf之類的覺得會比較快 -- 這罐海水留給我  這罐星砂送給你 裝滿我的思念  願你心想事成 ╭╯ ╰╮ ╭╯ ╰╮ ║~~~~ ║ ║☆☆☆║ ║ ~~~~ ║ ║☆☆☆║ ╰═══╯ ╰═══╯ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.77.34 > -------------------------------------------------------------------------- < 作者: aecho (星空下的鮪魚) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 11:53:20 2005 發現一個很好笑的事情 同樣的codes,用C寫的(沒用到C++的語法) 在寄的時候 compiler選C 是0.002秒 選C++ 就變成了 0.000秒 看來C++對C 的最佳化做的比較好 -- #include <stdio.h> #include <string.h> int main() { char m_str[3096]; int i; int len,pos,temp,count; while(fgets(m_str,sizeof(m_str),stdin) != NULL ){ len = strlen(m_str); pos = 0; count = 0; while (pos < len){ if (m_str[pos] == ' ' || m_str[pos] == '\n'){ temp = pos; for ( temp-- ; count ; count--,temp--) putchar(m_str[temp]); putchar(m_str[pos]); pos++; } else { pos++; count ++; } if (pos >= len) break; } } for ( pos-- ; count ; count--,pos--) putchar(m_str[pos]); return 0; } -- 給自己自信 不管面對什麼 總是能勇於創造 給自己謙虛 使自己能不斷的再學習 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.166.77.34 ※ 編輯: aecho 來自: 218.166.77.34 (05/28 11:55) > -------------------------------------------------------------------------- < 作者: kakashiliu (kakashi) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 16:48:45 2005 ※ 引述《aecho (星空下的鮪魚)》之銘言: : ※ 引述《catyun (喵貓~~)》之銘言: : : Accepted 0:00.002 64 : : for (--i;i>=0;i--) : : cout.put(buf[i]); : 看來原提問者應該是缺了這一步吧.... : 你的作法跟他最像了 : : return 0; : : } : 還要再快的話 我想不能用cin和cout吧 : 用printf和scanf之類的覺得會比較快 多謝各位大大來討論這題喔... 我學到不少方法呢... 原來我真的少了這行 我最後補上 for (i=str.length()-1;i>=pos;i--) cout << str[i]; 就成功AC了 不過是0:00.004啦... 但是知道原因就很高興了^^ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.58.184.8 > -------------------------------------------------------------------------- < 作者: windows2k (代替孟子來懲罰你) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 17:24:26 2005 ※ 引述《kakashiliu (kakashi)》之銘言: : 不過是0:00.004啦... : 但是知道原因就很高興了^^ 不知道算不算是雞婆,假設你送十次,得到的時間不一定相同 除非是演算法的差異導致相差幾十倍甚至幾百倍的差距 不然這麼零點零幾秒的差距一點也不重要,把這時間花在解難題還比較值得 @@ 火鳳燎原說:解一題難題,比解一百題白爛題來的痛快 -- 雖然我都是解白爛題就是了 ╮(╯_╰)╭ 其實這篇文章的目的在於P幣 Orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.115.220.139
kakashiliu:經過小道消息...大大您就是dcn吧!學長好阿^^ 61.58.184.8 05/28
yalight:我只會解白爛題...orz 140.115.204.30 05/28
aecho:me 2 , Orz 218.166.94.26 05/28
> -------------------------------------------------------------------------- < 作者: OTP (5輪3層帆布旅行袋) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 22:39:10 2005 regards: 請教一下大哥大姐,小小請教一下ACM是啥?...... 一種作業嗎?..... thank you May goodness be with you all Thank you,Positive Feedback to mikeotp@gmail.com -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.138.238.82 > -------------------------------------------------------------------------- < 作者: aecho (星空下的鮪魚) 看板: C_and_CPP 標題: Re: [問題] 請教ACM 483這題 時間: Sat May 28 23:12:10 2005 ※ 引述《OTP (5輪3層帆布旅行袋)》之銘言: : regards: : 請教一下大哥大姐,小小請教一下ACM是啥?...... : 一種作業嗎?..... ACM網站 http://acm.uva.es/p 去註冊一個帳號吧,網頁左上角有個Users的相關鏈結,有個可以寄codes給 auto-judge 下面是參考用的 星子ACM小站 http://chchu.spedia.net/ http://acm.webhop.info/ Lucky貓的ACM園地 http://www2.dmhs.kh.edu.tw/ 美麗 C世界 http://dhcp.tcgs.tc.edu.tw/c/index.htm -- 當你歡喜時,凝視你的內心深處,你會發現, 只有曾給你哀傷的,會在此刻讓你歡喜。 當你哀傷時,再次凝視你的內心深處,你會發現, 你其實是為了曾給你歡樂的事情哭泣。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.167.214.164