URAL1966 Cipher Message 3】的更多相关文章

题目描述 题解: 能看出来的是,每一组数只能改最后一位,所以前$7$位动不了. 所以$KMP$跑一跑. 重点在于最后一位怎么搞. 如果$KMP$跑完了还没找到合适的位置,直接$puts("No")$就好了. 剩下个匹配问题. (要不是数据范围拦着我我都想建图跑费用流了) 这个匹配可以用$FFT$求. $FFT$不是求$\sum(a[i]*b[j-i])$的吗?怎么求字符串匹配? 其实我们只想要最后多项式中某一位上的值,所以$b[j-i]$和$b[i]$没有区别,反转数组就好了. 我们要…
Cipher Message Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Description Müller tried to catch Stierlitz red-handed many times, but always failed because Stierlitz could ever find some excuse. Once Stierlitz was looking…
题目 Source http://acm.timus.ru/problem.aspx?space=1&num=1996 Description Emperor Palpatine has been ruling the Empire for 25 years and Darth Vader has been the head of the Empire Armed Forces. However, the Rebel movement is strong like it never used t…
题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1654 题意:简单的理解就是,把一个序列中相邻的且是偶数个相同的字符删除,奇数个的话就只保留一个.但是要注意,删除的过程中,可能会导致本来不相邻的相同字符变得相邻了,这时候也要删除.如果直接暴力:每次查看串中是否有相同的相邻字母,如果有就删去,然后继续从前向后查找,这样肯定会超时(O(N^2)). 优化的方法,利用栈的特殊结构O(N),从左向右扫描,判断当前的字符和栈顶元素是否相同,如果相同栈顶…
题意 给\(N,M(N,M \le 250000)\)的两个由8位二进制表示的两个序列,允许改变每个数字的第8位的数值(即0→1,1→0),求改变最少次数使得长为\(M\)的序列为长为\(N\)的连续子序列,在次数最少的前提下,找到下标最小的起始位置. 思路 因为只能改变第8位的状态,所以若能匹配的话,前7位数值需要相同,这步通过KMP完成即可. 剩下就是如何快速求每个匹配区间所需要的代价,即找出两个长为\(M\)的序列对应位不同的个数. 考虑位置\(A[i, i + M - 1]\),若按\(…
http://acm.hust.edu.cn/vjudge/contest/view.action?cid=34121#problem/C // File Name: c.cpp // Author: bo_jwolf // Created Time: 2013年10月16日 星期三 16:08:12 #include<vector> #include<list> #include<map> #include<set> #include<deque&g…
转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意 :给出两个串A , B,每个串是若干个byte,A串的每个byte的最后一个bit是可以修改的.问最少修改多少,使得B串是A的一个子串. 2013年NEERC的题.......感觉[buaa]sd0061教我做这题. NEERC是毛子题,但是这套题感觉除了题面很难读之外,并不是很难... 目前为止,J题貌似全队都没看题,E题还在WA中,其它题…
题目 神题. 记得当初DYF和HZA讲过一个FFT+KMP的题目,一直觉得很神,从来没去做. 没有真正理解FFT的卷积. 首先考虑暴力. 只考虑前7位 KMP 找出所有 B 串可以匹配 A 串的位置. 设 a(i) = A(i) & 1, b(i) = B(i) & 1 然后相当于求所有的 c(i) =  ∑k=0m-1 a(i+k) * b(k) 考虑卷积形式: c(i) =  ∑k=0m-1 a(k) * b(i - k) 将b串反过来 c(i) = ∑k=0m-1  a(k) * b…
题面传送门 题目大意:给你两个$01$串$a$和$b$,每$8$个字符为$1$组,每组的最后一个字符可以在$01$之间转换,求$b$成为$a$的一个子串所需的最少转换次数,以及此时是从哪开始匹配的. FFT怎么变成字符串算法了 每组的前$7$个字符是不能动的,所以把它压成一个数,用$kmp$求出$b$可能作为$a$子串的所有结束位置 求最少的转换次数呢,把$a,b$串每一组的最后一位取出来分别组成新串,再把$b$的新串反转求卷积即可 反转$b$串的目的是,让答案出现在同一个系数里,算是$FFT$…
传送门 解题思路 因为要完全匹配,所以前七位必须保证相同,那么就可以把前7位提出来做一遍\(kmp\)匹配,最后的答案一定在这些位置里.考虑最后一位,可以把最后一位单独取出来,要计算的是最后一位相同的个数,那么就可以做两次\(fft\)得到\(haming dis\).先把\(b\)翻转,然后做一次,得到的是全为\(1\)的个数,再把\(a,b\)取反做一次,得到的是全为\(0\)的个数,然后扫一遍\(kmp\)后的匹配位置,取个最小值. 代码 #include<iostream> #incl…