首页 > 代码库 > 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 加密
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。