8.14 fbi 2690

题目

两伙外星人策划在未来的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 I
c={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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值