FBI序列
【問題描述】
兩伙外星人策劃在未來的XXXX年侵略地球,侵略前自然要交換信息咯,現在,作為全球保衛隊隊長,你截獲了外星人用來交換信息的一段僅由’F’,’B’,’I’,’O’,組成的序列,為了保衛地球和平,為了使家園不受破壞,你要機智地破解密碼,勇敢地迎擊外星人!記住,你不是一個人在戰斗!你不是一個人!你的背后是千千萬萬的地球人!
【輸入文件】
一組僅由’F’,’B’,’I’,’O’,組成的序列(’F’,’B’,’I’,’O’這四個字母中的某一個或某幾個不一定會出現,且保證序列長度<=2000)
規定這個序列所要傳達的信息就是這組序列有多少個’FBI’(子序列)
【輸出文件】
一個數,表示這組序列有多少個’FBI’的子序列(保證答案<=2^31,且FBI必須是正序,即IBF或者BIF或者FIB或者BFI或者IFB都不能算是一個FBI)
【樣例輸入】
FBIIBFOI
【樣例輸出】
4
【樣例說明】
第一個FBI是由序列的第一個字母+序列的第二個字母+序列的第三個字母組成
第二個FBI是由序列的第一個字母+序列的第二個字母+第四個字母組成
第三個FBI是由序列的第一個字母+序列的第二個字母+第八個字母組成
第四個FBI是由序列的第一個字母+序列的第五個字母+第八個字母組成
分析
f[i]表示序列的前i位有多少個字母I
i枚舉F的位置,j枚舉B的位置,
ans:=ans+(f[l]-f[j]);
程序:
varl,i,j:longint;ans:int64;f:array[0..3000]of longint;zfc:ansistring; beginassign(input,'fbi.in');reset(input);assign(output,'fbi.out');rewrite(output);readln(zfc);l:=length(zfc);f[0]:=0;for i:=1 to l doif zfc[i]='I' then f[i]:=f[i-1]+1 else f[i]:=f[i-1];ans:=0;for i:=1 to l-2 doif zfc[i]='F' thenbeginfor j:=i+1 to l-1 doif zfc[j]='B' then ans:=ans+(f[l]-f[j]);end;write(ans);close(input);close(output); end.轉載于:https://www.cnblogs.com/YYC-0304/p/9500060.html
總結