b072: D. 打不倒的空氣人
內容 :
neko最近迷上了洛克人。但是他的技術很差,每次玩紅白機的洛克人2都會卡在空氣人這關,不管試了多少次就是過不了。於是neko只好上網搜尋攻略,網路上能找到的所有技巧他都試過了,什麼暫停連打之類的,還是一直打不贏。
最後,neko在google上找到了一篇文章,只要把文章中的密碼解開,用這個密碼登入某網站,裡面就會出現所有武器道具全滿的密技使用方法。聰明的neko也觀察出了密碼的解法:
這篇文章包含兩個部份,前半段是n個由小寫字母組成的英文單字,後半段是一個數列A1, A2, ..., Am 。將所有單字接成一個很長的字串,這個字串的第A1, A2, ..., Am個字母拼成的單字就是網站的密碼。
例如文章前半為 the quick brown fox jumps over the lazy dog
數列是 30, 6, 10, 19, 30, 13
答案就是字串"thequickbrownfoxjumpsoverthelazydog"的第30, 6, 10, 19, 30, 13個字母"airman"
(註:字串index由1開始)
由於文章非常長,neko希望你能幫他寫一個簡單的程式算出他要的密碼。
輸入說明 :
輸入檔中有許多組測試資料。每組測試資料的第一行是兩個正整數n(<1000001),m(<101)。接著n行是n個英文單字,每個字的長度不超過100。最後一行有m個正整數,以空白隔開,可以假設數字不會超過字串總長度。
讀到n = m = 0表示檔案結束,不須處理這組輸入。
輸出說明 :
對每組測試資料輸出解出的密碼,每個密碼佔一行。
範例輸入 :
9 6 the quick brown fox jumps over the lazy dog 30 6 10 19 30 13 10 12 cozy lummox gives smart squid who asks for job pen 38 18 19 6 15 29 7 12 31 37 16 23 0 0
範例輸出 :
airman barusamikosu
提示 :
* 請注意,本題目如果直接宣告一個 char s[1000000000]; 的陣列會因為過大而 RE(要 100MB 記憶體!!),實際上測資只用到約 5,000,000 個而已,更好的方式是使用 C++ 的 string(用 += 或 string.append() 來做字串串接),用多少才要多少,如果使用 C++ 語言的同學,是沒有需要用字元陣列來處理字串問題的。(NPSC 的參考解答就是一個很好的示範)
出處 :
2007 NPSC 高中組初賽
解題策略
依題意解題
待完成程式碼
#include <iostream>
#include <sstream>
using namespace std;
int main() {
string s,ins;
int n,m,pos;
while(cin >>n >>m){
if ((n==0)&&(m==0)) break;
s="";
for(int i=0;i<n;i++) { //串接字串成更長字串
cin >> ins;
s.append(ins);
}
for(int i=0;i<m;i++) { //找出第pos位置的字元
cin >> pos;
cout << s[pos- ];
}
cout << endl;
}
}