codevs3945 完美拓印

3945 完美拓印

codevs月赛 第一场

时间限制: 1 s

空间限制: 256000 KB

题目等级 : 黄金 Gold

题目描述 Description

小Q获得了一个神奇的印章,这个印章宽n个单位长度,印章的其中三个棱都是直的,而另外一个方向上,对于每个单位宽度的部分,是一样直的,并且与反方向的棱平行,如下图所示。

小Q的印章上有一个不关于中心对称的图形(不一定是上图的Qrz),他现在要在一张地图上拓上印,地图上有一段个m单位长度、近似水平的边界线,但是放大到单位长度时还是有一定的高低差异,但对于单位宽度的部分,是一样直的,与水平轴线垂直,如下图所示。

小Q希望自己的印章一边的边缘能恰好地与边界线重合(不能部分重合、不能越过边界线),他现在只可以将印章旋转180度或者不旋转(这样印章可能存在有两边可以与边界线重合的情况),然后平移到适当的位置,问小Q有多少种可行的方案,两种方案不同被定义为两种方案用印章印出的图案互不重合。

输入描述 Input Description

第一行两个正整数n和m,表示印章的宽度和截取边界线的长度。

第二行n个正整数,表示印章从左到右每个单位宽度对应的两条平行线之间的距离。

第三行m个整数,表示所截取边界线从左到右每个单位宽度对应的竖直方向上的坐标。

输出描述 Output Description

一个整数,表示可行方案的种类数。

样例输入 Sample Input

5 12

3 4 4 3 2

2 4 5 5 4 3 2 2 3 3 2 1

样例输出 Sample Output

3

数据范围及提示 Data Size & Hint

对于30%的数据,有n*m≤2*107

对于60%的数据,有n,m≤105

对于100%的数据,有n,m≤106,所有数字的绝对值不超过109

【思路】

字符串匹配。

将一面的凹凸情况作为一面的特征,如果两面的凹凸状况相同则可以印章,则问题转化为求两种凹凸状况的匹配数目,可以用KMP算法求解。

需要注意的是:

1、   底边也可以匹配。

2、   当n==1的时候应该特判(PT数组)。

【代码】

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5
 6 const int maxn = 1000000+10;
 7
 8 int a[maxn],b[maxn],P[maxn],T[maxn],f[maxn];
 9 int n,m,ans;
10
11 void get_Fail() {
12     f[0]=f[1]=0;
13     for(int i=1;i<n;i++) {
14         int j=f[i];
15         while(j && P[i]!=P[j]) j=f[j];
16         f[i+1]=P[i]==P[j]?j+1:0;
17     }
18 }
19
20 int KMP() {
21     get_Fail();
22     int j=0,cnt=0;
23     for(int i=0;i<m;i++) {
24         while(j && T[i]!=P[j]) j=f[j];
25         if(T[i]==P[j]) j++;
26         if(j==n) cnt++,j=f[j];
27     }
28     return cnt;
29 }
30
31 int main() {
32     scanf("%d%d",&n,&m);
33     for(int i=0;i<n;i++) scanf("%d",&a[i]);
34     for(int i=0;i<m;i++) scanf("%d",&b[i]);
35     if(n==1) {
36         printf("%d\n",m*4);
37         return 0;
38     }
39
40     n--; m--;
41     for(int i=0;i<n;i++) P[i]=a[i+1]-a[i];
42     for(int i=0;i<m;i++) T[i]=b[i+1]-b[i];
43     ans += KMP();
44
45     for(int i=0;i<n;i++) P[i]=a[n-i]-a[n-i-1];
46     ans += KMP();
47
48     for(int i=0;i<n;i++) P[i]=0;
49     ans += 2*KMP();
50
51     printf("%d\n",ans);
52     return 0;
53 }
时间: 2024-10-18 11:39:47

codevs3945 完美拓印的相关文章

记codevs第一次月赛

第一次参加这种有奖励的比赛(没错,我就是为猴子而去的 一年没怎么碰代码果然手生,还是用没写多久的C++,差点全跪了 T1数学奇才琪露诺: 首先定义一个函数F(x),F(x)=x的各个数位上的数字和 然后在区间[l,r]求F(x)k*p+q=x的所有x,按升序输出 T1题解: 枚举x肯定是不行的,F(x)的值只有0到81,我们枚举F(x)的值,然后算出F(x)k*p+q,看数位和是不是符合 可能会爆int,所以要开long long #include <cstdio> #include <

DP &#215; KMP

几道用到KMP的DP题: hdu 5763    hdu 3689    hdu 3336    codeforces 494B    codevs 3945 一道一道来~ hdu 5763  Another Meaning 题意及样例:原题链接 设第一个串为A,长为n:第二个串为B,长为L 从1到n计算1~k能代表的意思的数量f[k] 如果A[k-L+1,k]==B 则f[k]=f[k-L]+f[k-1] 否则f[k]=f[k-1] 判断A[k-L+1,k]是否与B匹配就要靠KMP了 1 #i

滔苘淄行傧tdru11nd4s18u96

杜维伦眉头紧皱,这戴华斌虽然实力强悍,但性格却有点太过凶狠了.而且,他这等桀骜不驯的学员,随着实力的增强,性格也会变得越来越强,将更难控制.也就在这个时候,一双巨大的蓝金色双翼,带着无比炫目的光彩在霍雨浩身后展开,那蓝色与金色的完美结合,散发着浓浓金色光焰的炫丽,一下子就成为了吸引全场的焦点.第二种解决的方式就是趁着玄武降临全面爆发之前击溃徐三石,唯有如此才能终止他召唤玄武降临的仪式.为什么比赛规则第一轮是淘汰赛赛制?除了减少参赛学院数量之外,也是为了让比赛更加精彩激烈啊!冰碧蝎左臂骨入手,霍雨

太多的爱不是爱,而是巨大的伤害

养过两条小金鱼,一红一白,像两朵小花,在水里开. 为这两条小金鱼,我特地买了一只漂亮的鱼缸.还不辞十来里,去城郊的河里,捞得鲜嫩的水草几根,放进鱼缸里. 专买的鱼食,放在随手可取的地方.一有闲暇,我就伏在鱼缸前,一边给它们喂食,一边不错眼地看它们.它们的红身子白身子,穿行于绿绿的水草间,如善舞的伶人,长袖飘飘于舞台上,煞是动人. 某天清晨,我起床去看它们,却发现它们翻着肚皮,死了.鱼缸静穆,水草静穆.我难过了很久.朋友得知,笑我:"它们是被你的爱害死的."原来,给鱼喂食不能太勤,太勤了

杭州摇到号,沪C转浙A流程、价格、黄牛代办杭州上牌最新攻略

摇号中了,将沪c转浙a,亲测流程: 一,沪c提档 1. 车开到上海提档,车必须去,人可以不去 2. 车当天开回杭州,下牌照寄往上海,此时车由于无牌不能动. 3. 等待一周左右,上海档案和沪x临牌寄回.切记,档案不可自己拆开. 4. 由于上班较忙,上述流程找人代驾代办.耗时一周 (上海代办微信:810998992). 二,浙a上牌 1. 由于沪x限行,早七点前到达石祥路汽车城车管所,切记北门进.七点前基本就有排队的了. 2. 大概七点多北门打开,跟随车流按道路引导进车管所内排队 3. 排队验车,等

从零入手体验指纹膜代打卡全过程

最近网友中流传一些使用透明胶,易拉罐,用蜡烛熏黑易拉罐后拓印的方式制作指纹膜,然后用于代打卡好得全勤的方法.真的能有效吗?按照其中的方法是否可行,找了几个朋友一起做了实验,结论是:完全没有效果,太没有科技含量了. 有没有办法能解决上班族早起难,迟到多的问题呢,百度搜索,百度帖吧,百度知道,百度收藏逛了一个遍,大概有一个思路.需要交流制作心得可以加微信 luoxiuying2008 (长按可复制) 那就是硅胶指纹膜,听这个名字就比较专业,而且最大的好处是成本很低,心里暗暗觉得这个可能会实验成功!

匀眼劳扑了su6zvb09j065824xt

听到雨浩二字,镜红尘的目光这才转变了一下方向,看到了这不过十几岁的孩子.rì月皇家魂导师学院的战报中,这个名字出现的次数是最多的.甚至还要过史莱克战队队长马小桃和副队长戴钥衡."哦."作为一名学员,霍雨浩此时只能是个看客.立刻施展出了自己的精神探测共享向那中年人身上落去.似乎是感受到了他们的到来,那人缓缓收拳而立,长出口气,一声宛如虎啸般的轰鸣掀起,刹那间,那牛皮大帐周围数百米范围内,狂风大作.真的是宛如一头猛虎降临一般.肃杀的气息令每一名史莱克学院弟子都有种汗毛倒竖的感觉.清雅微微一

高考替考事件为指纹识别技术敲响警钟

指纹识别技术存在严重安全漏洞 河南高考替考案中暴露出来的指纹膜以假乱真,也让反作弊问题浮出水面.指纹识别认证受环境温度和个人皮肤条件影响较大等原因,部分考生指纹不易 采集,且市场上又出现了大量复制指纹的产品,给通过指纹验证考生身份造成困扰.而现实中,用印泥盗取他人指纹的情形更是屡屡发生. 上述种种危险传递出一个信号:技术已趋成熟且获广泛应用的指纹识别技术,仍存在其自身难以克服的安全漏洞.由于指纹裸露于体表,无法避免被复制及窃取,急需更加安全且同样便捷的身份识别和安防技术. 现在不少公司都装配了指

linux 增删改查

linux的增删改查命令 前言: 现在工作中越来越多的人用到了linux了,它的强大功能,系统开源,为工程师们提供了特别良好的工作环境,当然在国内最主要的一个原因就是免费,当然免费不等于开源, 在了解GPL条款      GPL条款是为保证GNU软件可以自由地使用.复制.修改和发布,所有GNU软件都有一份在禁止其他人添加任何限制的情况下授予所有权利给任何人的协议条款.      3) 了解自由软件意味着:      a) 你有自由以任何目的来运行该程序.      b) 你有修改程序满足自己需求