SSL P2755 密码

来源:互联网 发布:log4j2连接数据库 编辑:程序博客网 时间:2024/06/05 14:01

题目大意:

假发通过了不懈的努力,得到了将军家门锁的密码,他加密了密码。加密方法如下:随机地,在密码中任意位置插入随机长度的小写字符串。
现在给出加密密码串跟原密码串,截去头和尾各一段(可以为空),让剩下的中间那一段依然包含真密码。求有多少种可行方案。

加密密码串长度不超过300000
密码串长度不超过200
30%的数据满足第一行长度不超过1000
注意:不剪也是一种方案。
密码保证为一串小写英文字母

题解:

在加密字符串中寻找原密码首位,记录下标l,下一个出现的原密码首位下标r,然后依次往后找密码的其他字符,直到找到末尾字符,这样就不用担心末尾字符后面还有末尾字符的重复
因为例如
abaaa aba
你可能会想
abaa a
而这样其实包含在
aba aa 里面,所以找到的是第一个末尾符号不会重复计算
此时方案数+(r-l)*(n-i+1),因为前面计算过的后面可能会重复,所以我们记录下标去重

var    i,j,s1,t1,l1,l2:longint;    s:ansistring;    ans:int64;    t:string;begin      readln(s);      readln(t);      s1:=length(s);      t1:=length(t);      i:=0; j:=1;      while i+1<=s1 do      begin           while (i+1<=s1) and (s[i+1]<>t[j]) do inc(i);           inc(i);           if i>s1 then break;           if j=1 then              begin                    l1:=l2;                    l2:=i;              end;           if j=t1 then           begin                   ans:=ans+(l2-l1)*(s1-i+1);                   i:=l2; j:=0;              end;           inc(j);      end;      writeln(ans);end.