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;

}

}