ACM模板(持续补完)

1、KMP

 1 #include<cstring>
 2 #include<algorithm>
 3 #include<cstdio>
 4 using namespace std;
 5 const int maxn=1e6;
 6 char a[maxn+50],b[maxn+50];
 7 int f[maxn+50];
 8 int len1,len2,t;
 9 int main()
10 {
11     scanf("%d\n",&t);
12     while(t)
13     {
14         --t;
15         scanf("%s%s",b,a);//a是母串 b是匹配串
16         len1=strlen(a),len2=strlen(b);
17         memset(f,0,sizeof(f));
18         f[0]=f[1]=0;//f[i]失配函数
19         for(int i=1;i<len2;++i)
20         {
21             int j=f[i];
22             while(j&&b[i]!=b[j]) j=f[j];
23             if(b[i]==b[j]) f[i+1]=j+1;else f[i+1]=0;
24         }
25         int j=0,ans=0;
26         for(int i=0;i<len1;++i)
27         {
28             while(j&&a[i]!=b[j]) j=f[j];
29             if(b[j]==a[i])  ++j;
30             if(j==len2) ++ans;
31         }
32         printf("%d\n",ans);
33     }
34     return 0;
35 }

2、扩展KMP

 1 #include<cstring>
 2 #include<algorithm>
 3 #include<cstdio>
 4 using namespace std;
 5 const int maxn=1e6;
 6 char S[maxn+50],T[maxn+50];//S是母串,T是子串
 7 int len1,len2;
 8 int next[maxn+50],extend[maxn+50];//extend[i]表示S[i..len1-1]和T的最长公共前缀的长度,next[i]表示T[i..len2-1]和T的最长公共前缀的长度
 9 void getnext()
10 {
11     next[0]=len2;
12     int j=0;
13     while(j+1<len2&&T[j]==T[j+1]) ++j;
14     next[1]=j;
15     int k=1;
16     for(int i=2;i<len2;++i)
17     {
18         int p=k+next[k]-1,l=next[i-k];
19         if(i+l<p+1) next[i]=l;
20         else
21         {
22             j=max(p-i+1,0);
23             while(i+j<len2&&T[i+j]==T[j]) ++j;
24             k=i;
25         }
26     }
27 }
28 void ekmp()
29 {
30     int j=0;
31     while(j<len1&&j<len2&&S[j]==T[j]) ++j;
32     extend[0]=j;
33     int k=0;
34     for(int i=1;i<len1;++i)
35     {
36         int p=k+extend[k]-1,l=next[i-k];//p表示到达的最远位置,k是对应最远位置的i
37         if(i+l<p+1) extend[i]=l;
38         else
39         {
40             j=max(p-i+1,0);
41             while(i+j<len1&&j<len2&&S[i+j]==T[j]) ++j;
42             extend[i]=j;
43             k=i;
44         }
45     }
46 }
47 int main()
48 {
49     scanf("%s%s",S,T);
50     len1=strlen(S),len2=strlen(T);
51     getnext();
52     ekmp();
53     for(int i=0;i<len1;++i) printf("%d ",extend[i]);
54     return 0;
55 }

时间: 2024-10-06 00:07:10

ACM模板(持续补完)的相关文章

JavaScript函数补完:toString()

javascript中的toString()方法,主要用于Array.Boolean.Date.Error.Function.Number等对象.下面是这些方法的一些解析和简单应用,做个纪律,以作备忘. Array.toString() 将数组转换成一个字符串,并且返回这个字符串. 描述:当数组用于字符串环境中时,javascript会调用这一方法将数组自动转换成一个字符串.toString()在把数组转换成字符串时,首先要将数组的每个元素都转换成字符串(通过调用这些元素的toString方法)

PHP函数补完:stream_context_create()模拟POST/GET

PHP函数补完:stream_context_create()模拟POST/GET PHP流的创建 在 2011年01月08日 那天写的     已经有 9408 次阅读了 感谢 参考或原文 服务器君一共花费了94.075 ms进行了3次数据库查询,努力地为您提供了这个页面. 试试阅读模式?希望听取您的建议 有时候,我们需要在服务器端模拟 POST/GET 等请求,也就是在 PHP 程序中去实现模拟,改怎么做到呢?或者说,在 PHP 程序里,给你一个数组,如何将这个数组 POST/GET 到另外

自动补完不算什么,autojump一键直达目录才是终极神器

在命令行中切换目录是最常用的操作,不过很少有比一遍又一遍重复"cd ls cd ls cd ls --"更令人沮丧的事情了.如果你不是百分百确定你想要进入的下一个目录的名字,那么你不得不使用ls来确认,然后使用cd来进入你想要进的那一个.所幸的是,现在大量的终端和shell语言提供了强大的自动补全功能来处理该问题.但是,你仍然需要一直疯狂地敲击TAB键来干这事.如果你和我一样懒惰,你一定会对autojump感到惊喜. autojump是一个命令行工具,它允许你可以直接跳转到你喜爱的目录

哈萨比斯的人类补完计划

在著名动漫<新世纪福音战士>里,碇源堂和他背后的SEELE组织始终在执行一项叫做"人类补完计划"的神秘行动. 这个计划到底是什么意思,粉丝们已经争吵了很多年.但大体上应该是说利用"神性"来补完人类族群,从而消除人类社会中的种种问题.也就是说,这个计划是"把人类补完的计划". 但"人类补完"这个词,其实还可以有另一种解释,就是"用人类去补完某种东西的计划".有东西需要用人类来补完吗?当然有,比如说

第十届山东省acm省赛补题(2)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4124 L Median Time Limit: 1 Second      Memory Limit: 65536 KB Recall the definition of the median of  elements where  is odd: sort these elements and the median is the -th largest element.

近期打算及毕业前要补完的题

之前总是开玩笑的说“退竞了退竞了”,这次看来是真的退役了.想想这一年来的学习历程,有欢笑也有汗水.可能还是因为自己太菜,可能还是因为自己不够努力,最终还是滚去学文化课了. 辜负了教练(手动@aqx)和朋友的关心和帮助,在这里说一声,抱歉 看着群里的各位都在快速的成长,除了自己内心的愧疚之外,也由衷的替他们感到开心. NOIP2018还剩100多天了,小伙伴们加油!XTYZ加油!祝各位RP++ 那么既然退役就要完完整整地结束,近期先准备把luogu博客上的文章慢慢的搬过来,之后应该就是一点点的把之

模板区域[未完待续](会定期的更新哦(有时间就更了))

写这个博客目的就是为了记录下学过的模板方便我这焫鷄复习吧//dalao们绕道 近期学的: (1)来自机房学长jjh大神教的求1~n的所有最小素因数和加上本焫鷄的批注 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath>//求1~n的最小质因数 using namespace std; const int MAXN=1e6+

东拼西凑的模板&#183;持续更新中

一.常用算法(应该不需要用到模板的那种常用) 1.1 快速幂 1 //https://blog.csdn.net/java_c_android/article/details/55802041 2 long long quickmod(long long a,long long b,long long m) 3 { 4 long long ans = 1; 5 while(b)//用一个循环从右到左便利b的所有二进制位 6 { 7 if(b&1)//判断此时b[i]的二进制位是否为1 8 { 9

ACM模板——简单博弈

巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物, 规定每次至少取一个,最多取m个.最后取光者得胜. if(n%(m+1)) first win else second win 巴什博弈 变种:取光者输 if(!(n-1)%(m+1)) second win else first win 巴什博弈变种 威佐夫博弈:有两堆各若干个物品,两个人轮流从任一堆取至少一个或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜. double r = (sqrt(5.0)+1)/2