這題測資應該有問題
連丟NPSC公佈的解答都會錯= =
經過檢查,發現是題目的 記憶體限制 (memorylimit: 10000KBytes) 限制了 string 的長度
因此導致 RE。
為了因應 NPSC 常有的這種大量測資,因此所有題目的記憶體限制全面放寬為 50 MBytes
如果以前有一些題目覺得 RE 的莫名其妙,可以去重測看看(按 RE 旁的 即可),說不定就過了。
感謝 sa411022 提出這個問題
補充: RE 的訊息為 SIGABRT 的才可能是這個問題哦
一個奇怪的問題
這是NPSC公佈的code:
#include<iostream>
#include<string>
using namespace std;
int main() {
int n, m;
while(cin >> n >> m, n) {
string s, t;
while(n--) {
cin >> t;
s += t;
}
int x;
while(m--) {
cin >> x;
cout << s[x-1] ;
}
cout << endl;
}
}
這是我寫的code:
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n, m;
while(cin >> n >> m, n)
{
string tmp, str;
while(n--)
cin >> tmp, str = str + tmp;
int num;
while(m--)
cin >> num, cout << str[num - 1];
cout << endl;
}
}
明明一模一樣
上面的AC 下面的TLE
不知是何故?
因為這個 operator + 是一個很沒有效率的運算子
它另外產生了一個兩倍長度的字串,然後把第一個字串 copy 進去 再接上 第二個字串
所以效率不好
一般程式少量使用時應該是沒有太大差別,但是比賽題目就是想要測你這一個點
所以還是得改成用 str = str.append(tmp); 就不會老是重頭 copy 了
這點字串處理跟 JAVA 很像,JAVA 則改用 StringBuffer.append() 來處理字串串接
NPSC 的參考解答 operator += 也是做了 append 的事所以速度過得去
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(){
do{
char in[25][25]={"\0"},ans[50]={"\0"};
int n,m,a[25]={0};
register int i;
scanf("%d",&n);
scanf("%d",&m);
if(n==0&&m==0) break;
for(i=0;i<n;i++){
scanf("%s",in[i]);
strcat(ans,in[i]);
}
for(i=0;i<m;i++)
scanf("%d",&a[i]);
for(i=0;i<m;i++)
printf("%c",ans[a[i]-1]);
}while(1);
return 0;
}
這是我的code 我也會一直RE
不知道哪邊有錯了...
可以幫我看看媽?
所以admin大大您的意思是說
a += b; 會比 a = a + b; 快囉?
//感覺國中組的好簡單,連strcat都會過......
但是+=會比=快只限於某些情況吧
程式語言內建的型態如int, long, 等等的,應該就不會比較快?
應該是重載運算子的差異?
對於string來說,
是不是因為operator+可能是c=a+b的情況,
所以才產生2倍長的字串,而比較慢,
但是+=會比=快只限於某些情況吧
程式語言內建的型態如int, long, 等等的,應該就不會比較快?
應該是重載運算子的差異?
對於string來說,
是不是因為operator+可能是c=a+b的情況,
所以才產生2倍長的字串,而比較慢,
你說得沒有錯,對於基本資料形態來說沒有差別
但對於 ”物件“ 來說,通常 += 會比 + 有效率
因為 + 必須處理更一般化運算,且通常都要產生新物件以便指定給 =號 左邊的變數,會額外消耗一個暫時物件的建構、解構的成本
而 += 因為已經知道要賦值的對象就是自己,因此不需再建立新物件