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 ...
随机推荐
- Ubuntu系统建立交叉编译环境
飞凌 FET6818核心板 解压编译器: tar zxvf arm-cortex_a9_eabi-4.7-eglibc-2.18.tar.gz -C/opt 设置默认编译环境: vi /etc/pr ...
- Vue的学习
1.Vue是什么 参考Vue官网,一套用于构建用户界面的渐进式框架. 2.什么是渐进式框架 引用大神的话:“它给你提供足够的optional,但并不主张很多required,也不多做职责之外的事!这就 ...
- [数]数学系列预习->补水题ver.
---恢复内容开始--- 话说要学反演了,contest一题都搞不定,整理题目暂且搁置,数学笨蛋来学一下数学_(:з」∠)_ ---恢复内容结束--- 是的,预习看了半天教学,没有整理,做题又都不会, ...
- hdu 1754 I Hate It 解题报告(线段树 代码+注释)
题目链接:传送门 I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- 星星闪烁+多边形移动 canvas
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Floyd判断环算法总结
Floyd判断环算法 全名Floyd’s cycle detection Algorithm, 又叫龟兔赛跑算法(Floyd's Tortoise and Hare),常用于链表.数组转化成链表的题目 ...
- Django基础-01
Django 是基于 Python,所有的 Django 代码都是用Python写成的. Django 特点 强大的数据库功能 拥有强大的数据库操作接口(QuerySet API),如需要也能执行原生 ...
- Python随笔--继承
- h264文件分析(纯c解析代码)
参考链接:1. 解析H264的SPS信息 https://blog.csdn.net/lizhijian21/article/details/80982403 2. h.2 ...
- MinHook测试分析02 (x64)
在X64模式中,存在的问题是JMP指令和整个地址空间相比仅仅覆盖了很窄的范围.因此引入一个中继函数(Relay Function)来实现对64位Detour函数地址的跳转. 在hook的分析之前,先谈 ...