标签:class 代码 name 位置 unix 计算 scan log 整数
有一种不讲道理的加密方法是: 在字符串的任意位置随机插入字符。 相应的,
不讲道理的解密方法就是从字符串中恰好删去随机插入的那些字符。
给定原文?和加密后的字符串?,求?有多少子串可以通过解密得到原文?。
输入第一行包含一个字符串?,第二行包含一个字符串?。
输出一行,包含一个整数,代表可以通过解密得到原文的?的子串的数量。
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" #endif using 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; }
标签:class 代码 name 位置 unix 计算 scan log 整数
原文地址:http://www.cnblogs.com/jyhywh/p/6056669.html