首页 > 代码库 > 11.12 模拟赛T1 加密

11.12 模拟赛T1 加密

【问题描述】

有一种不讲道理的加密方法是: 在字符串的任意位置随机插入字符。 相应的,

不讲道理的解密方法就是从字符串中恰好删去随机插入的那些字符。

给定原文?和加密后的字符串?,求?有多少子串可以通过解密得到原文?。

【输入格式】

输入第一行包含一个字符串?,第二行包含一个字符串?。

【输出格式】

输出一行,包含一个整数,代表可以通过解密得到原文的?的子串的数量。

【样例输入】

abcabcabc
cba

【样例输出】

9

【样例解释】

用[l,r]表示子串开头结尾的下标(从 0 开始编号) ,这 9 种方案是:
[0,6],[0,7],[0,8],[1,6],[1,7],[1,8],[2,6],[2,7],[2,8]

【数据规模和约定】

30%的数据,|t|≤1000。
对于100%的数据,1 ≤ |t| ≤ 300,000,1 ≤|s|≤ 200。

代码:

#include<cstdio>#include<cstring>#include<iostream>#ifdef unix#define ll "%lld"#else#define ll "%I64d"#endifusing namespace std;char s[201],t[300001];int l1,l2;long long ans;int main(){    freopen("encrypt.in","r",stdin);    freopen("encrypt.out","w",stdout);    int i,j;    scanf("%s%s",t,s);    l1=strlen(t);    l2=strlen(s);    i=j=0;    int be=-1,ss=-1;    while(i<l1)    {        if(t[i]==s[0]&&be==-1)          be=i;        if(t[i]==s[j])          j++;        if(j==l2)        {            j=0;            ans=ans+(long long)(be-ss)*(l1-i);//统计方案数            i=be;            ss=be;//防止重复计算            be=-1;        }        i++;    }    cout<<ans;    fclose(stdin);    fclose(stdout);    return 0;}

 

11.12 模拟赛T1 加密