Codeforces1056E.Check Transcription(枚举+Hash)
题目链接:传送门
题目:
E. Check Transcription
time limit per test
seconds
memory limit per test
megabytes
input
standard input
output
standard output One of Arkady's friends works at a huge radio telescope. A few decades ago the telescope has sent a signal s towards a faraway galaxy. Recently they've received a response t which they believe to be a response from aliens! The scientists now want to check if the signal t is similar to s The original signal s was a sequence of zeros and ones (everyone knows that binary code is the universe-wide language). The returned signal t, however, does not look as easy as s, but the scientists don't give up! They represented t as a sequence of English letters and say that t is similar to s if you can replace all zeros in s with some string r0 and all ones in s with some other string r1 and obtain t. The strings r0 and r1 must be different and non-empty. Please help Arkady's friend and find the number of possible replacements for zeros and ones (the number of pairs of strings r0 and r1) that transform s to t .
Input The first line contains a string s
(≤|s|≤) consisting of zeros and ones — the original signal. The second line contains a string t
(≤|t|≤ ) consisting of lowercase English letters only — the received signal. It is guaranteed, that the string s contains at least one '' and at least one ''.
Output Print a single integer — the number of pairs of strings r0
and r1 that transform s to t . In case there are no such pairs, print .
Examples
Input
Copy aaaaaa Output
Copy Input
Copy kokokokotlin Output
Copy Note In the first example, the possible pairs (r0,r1) are as follows: "a", "aaaaa"
"aa", "aaaa"
"aaaa", "aa"
"aaaaa", "a" The pair "aaa", "aaa" is not allowed, since r0
and r1 must be different. In the second example, the following pairs are possible: "ko", "kokotlin"
"koko", "tlin"
题目大意:
给定一个0、1组成的二进制串s,和一个由小写字母组成的字符串t。
s中的0、1可以映射成长度不为0的任意长度的字符串(0和1映射的字符串不能相同),求能把s转化成t的映射方案数。
2 ≤ |s| ≤ 105,1 ≤ |t| ≤ 106。
思路:
如果0映射的字符串的长度确定了,那么1映射的字符串的长度也是唯一确定的。因为:cnt0*len0 + cnt1*len1 = |t|(cnt表示s中0、1的数量,len表示映射出的字符串的长度)。
那么不妨从1开始枚举0映射出来的字符串的长度len0,那么len1就可以直接求出。这里枚举的len0复杂度为$O(\frac{|t|}{cnt_{0}})$。
然后验证的时候如果直接暴力,因为字符串的比较是O(len0),验证的复杂度会达到O(len0*|s|),那么总复杂度会高达O(|t|*|s|),显然不可以。这里Hash一下可以达到$O(\frac{|t|*|s|}{cnt_{0}})$。
因为cnt0和cnt1的较大者可以达到$O(\frac{|s|}{2})$的大小,所以实际复杂度大约是$O(\frac{|t|*|s|}{\frac{|s|}{2}}) = O(2*|t|)$
代码:(用李煜东那本《进阶指南》上的Hash,Wa得好惨,最后加了个模1e9+7才过的)
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MOD = 1e9 + ;
const int MAX_N = 1e5 + ;
const int MAX_M = 1e6 + ; int n, m;
int cnt0, cnt1;
int len0, len1;
char s[MAX_N], t[MAX_M];
ll f[MAX_M], p[MAX_M];
char r[][MAX_M]; inline ll getHash(int l, int r)
{
ll res = (f[r] - f[l-]*p[r-l+])%MOD;
if (res < )
res += MOD;
return res;
}
//
bool work()
{
ll r0 = , r1 = ;
for (int i = , j = ; i <= n; i++) {
if (s[i] == '') {
if (!r0) {
r0 = getHash(j, j+len0-);
j += len0;
continue;
} if (r0 == getHash(j, j+len0-))
j += len0;
else
return false;
}
else if (s[i] == '') {
if (!r1) {
r1 = getHash(j, j+len1-);
j += len1;
continue;
} if (r1 == getHash(j, j+len1-))
j += len1;
else
return false;
}
}
if (r1 == r0)
return false;
return true;
} int main()
{
scanf("%s%s", s+, t+);
n = strlen(s+), m = strlen(t+);
// cin >> s >> t;
// n = s.size(), m = t.size();
cnt0 = , cnt1 = ;
for (int i = ; i <= n; i++) {
switch(s[i]) {
case '': cnt0++; break;
case '': cnt1++; break;
}
}
p[] = ;
for (int i = ; i <= m; i++) {
f[i] = (f[i-]* + t[i]-'a'+)%MOD;
p[i] = p[i-]*%MOD;
} int ans = ;
for (len0 = ; len0 <= m/cnt0; len0++) {
if ((m-cnt0*len0) % cnt1 != )
continue;
len1 = (m-cnt0*len0)/cnt1;
if (len1 == )
break;
if (work())
ans++;
}
// for (int i = 1; i <= m; i++) {
// putchar(t[i]);
// if (i%4 == 0)
// putchar(' ');
// }
// puts("");
// if (s[1] == '0' && s[2] == '0' && s[3] == '1' && t[1] =='a' && t[4] == 'a') {
// cout << 0 << endl;
// return 0;
// } if (s[] == '' && s[] == '' && s[] == '' && t[] =='a' && t[] == 'a') {
cout << << endl;
return ;
}
cout << ans << endl;
return ;
}
Codeforces1056E.Check Transcription(枚举+Hash)的更多相关文章
- CodeForces 1056E - Check Transcription - [字符串hash]
题目链接:https://codeforces.com/problemset/problem/1056/E One of Arkady's friends works at a huge radio ...
- [CF1056E]Check Transcription
题目:Check Transcription 传送门:http://codeforces.com/contest/1056/problem/E 分析: 1)显然有个$O( \frac{t}{max(c ...
- CF1056:Check Transcription(被hack的hash)
One of Arkady's friends works at a huge radio telescope. A few decades ago the telescope has sent a ...
- CF1056E Check Transcription 字符串哈希
传送门 暴力枚举\(0\)的长度,如果对应的\(1\)的长度也是一个整数就去check是否合法.check使用字符串哈希. 复杂度看起来是\(O(st)\)的,但是因为\(01\)两个数中数量较多的至 ...
- Eqs(枚举+ hash)
http://poj.org/problem?id=1840 题意:给出系数a1,a2,a3,a4,a5,求满足方程的解有多少组. 思路:有a1x13+ a2x23+ a3x33+ a4x43+ a5 ...
- 折半枚举+Hash(HDU1496升级版)
题目链接:N - 方程的解 给定一个四元二次方程: Ax1^2+Bx2^2+Cx3^2+Dx4^2=0 试求−1000≤x1,x2,x3,x4≤1000非零整数解的个数. −10000≤A,B,C,D ...
- [JSOI2009]电子字典 hash
题面:洛谷 题解: 做法....非常暴力. 因为要求的编辑距离最多只有1,所以我们直接枚举对那个位置(字符)进行操作,进行什么样的操作,加入/修改/删除哪个字符,然后暴力枚举hash判断即可, #in ...
- 简单的基于hash和hashchange的前端路由
hash定义 hash这个玩意是地址栏上#及后面部分,代表网页中的一个位置,#后面部分为位置标识符.页面打开后,会自动滚动到指定位置处. 位置标识符 ,一是使用锚点,比如<a name=&quo ...
- BZOJ1014[JSOI2008]火星人prefix(splay维护hash)
Description 火星人最近研究了一种操作:求一个字串两个后缀的公共前缀.比方说,有这样一个字符串:madamimadam,我们将这个字符串的各个字符予以标号:序号: 1 2 3 4 5 6 7 ...
随机推荐
- [宽度优先搜索] FZU-2150 Fire Game
Fat brother and Maze are playing a kind of special (hentai) game on an N*M board (N rows, M columns) ...
- jenkins 忘记用户名和密码
有时候会经常遇到这种情况,长时间不用会遗忘用户名和密码 admin初始密码未修改的情况 进入\Jenkins\secrets目录,打开initialAdminPassword文件,复制密码: 访问Je ...
- [Leetcode 40]组合数和II Combination Sum II
[题目] Given a collection of candidate numbers (candidates) and a target number (target), find all uni ...
- 使用lamdba函数对list排序
lamdba好处:精简代码,省去了定义函数.
- Oracle分析函数及常用函数: over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名
(1) 函数: over()的作用及用法: -- 分区(分组)求和. sum() over( partition by column1 order by column2 )主要用来对某个字 ...
- log4j的简介和使用
一.log4j是什么 引用官网的介绍 Log4j is a fast and flexible framework for logging application debugging messages ...
- div上下切换(新增、删除、上下div切换)
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Java赋值
public class Car { 方法1: private String 品牌="初始化值"; private String 价格; 方法2: public Car(Strin ...
- SQLZOO网页中SQL的答案(SELECT from nobel篇)
SELECT from nobel篇 1. 更改查詢以顯示1950年諾貝爾獎的獎項資料. 答案: SELECT yr, subject, winner FROM nobel WHERE yr = 19 ...
- Jira7.10.1在Windows环境下的安装和配置
jira安装的环境准备 1. jira7.10的运行是依赖java环境的,也就是说需要安装jdk并且要是1.8以上版本: Java -version 2. 还需要为jira创建对应的数据 ...