推 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