8.14 fbi 2690

来源:互联网 发布:b2b源码php 编辑:程序博客网 时间:2024/05/21 05:56

  • 题目
  • 题解
  • 代码

题目

两伙外星人策划在未来的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)

题解

我想这大概算是O(n)的算法,嗯,亏我打了半天(小时),人家暴力都过了!好气啊,早知道打暴力了

具体做法:
记录’F”B’下一个出现的位置,记录’F”B’下一个’B”I’出现的位置,记录还有多少个’I’,然后累加答案。例:

   F B I I B F O Ic={2,3,0,0,8,0,0,0}//下一个出现的位置,类似链表f={6,5,0,0,0,0,0,0}//仍类似链表a={0,0,3,2,0,0,0,1}//还有多少个'I'

代码

var  s:ansistring;  i,j,k,l,t,x,ans:longint;  a,f,c:array[0..2005]of longint;begin  assign(input,'fbi.in');  assign(output,'fbi.out');  reset(input);rewrite(output);  readln(s);  if (pos('F',s)=0)or(pos('B',s)=0)or(pos('I',s)=0) then    begin writeln(0);exit;end;  for i:=length(s) downto 1  do    begin      if s[i]='F' then        begin c[i]:=k;f[i]:=j;j:=i;end;      if s[i]='B' then        begin c[i]:=l;f[i]:=k;k:=i;end;      if s[i]='I' then        begin a[i]:=a[l]+1;l:=i;end;    end;  while j>0 do    begin      t:=c[j];      while t>0 do        begin          x:=c[t];          ans:=ans+a[x];          t:=f[t];        end;      j:=f[j];    end;  writeln(ans);  close(input);close(output);end.
原创粉丝点击