Manacher模板,kmp,扩展kmp,最小表示法模板
// Manacher算法,很好用。 char s[*N]; //储存临时串
int save[*N];//中间记录 int Manacher(char tmp[])
{
int len=strlen(tmp);
int cnt=;
for(int i=;i<len;i++)
{
s[cnt++]='#';
s[cnt++]=tmp[i];
}
s[cnt++]='#';
memset(save,,sizeof(save));
int a=,p=;
int mx=;
for(int i=;i<cnt-;i++)
{
if(i>=p)
{
int num=;
while(i+num<cnt&&i-num>=&&s[i+num]==s[i-num])
{
num++;
}
p=i+num-; //能到达的最远位置
a=i;
save[i]=num-; //从这个位置出发最长的回文
if(save[i]==) continue;
if(s[i]=='#')
{
if(*((save[i]-)/ +)>mx) mx=*((save[i]-)/+);
}
else
{
if(*(save[i]/)+>mx) mx=*(save[i]/)+;
}
}
else
{
int j=*a-i;
if( i+save[j] < p)
{
save[i]=save[j];
if(save[i]==) continue;
if(s[i]=='#')
{
if(*((save[i]-)/ +)>mx) mx=*((save[i]-)/+);
}
else
{
if(*(save[i]/)+>mx) mx=*(save[i]/)+;
}
}
else
{
int k=*i-p;
while(p+<cnt&&k->=&&s[p+]==s[k-])
{
p++;
k--;
}
a=i;
save[i]=p-i;
if(save[i]==) continue;
if(s[i]=='#')
{
if(*((save[i]-)/ +)>mx) mx=*((save[i]-)/+);
}
else
{
if(*(save[i]/)+>mx) mx=*(save[i]/)+;
}
}
}
}
return mx;
}
kmp,扩展kmp
// 感觉kmp可以理解。 #define N 100010
int s[N];
int next[N];
int t[N]; int main()
{
//freopen("//home//chen//Desktop//ACM//in.text","r",stdin);
//freopen("//home//chen//Desktop//ACM//out.text","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
scanf("%d",s+i);
for(int i=;i<m;i++)
scanf("%d",t+i);
///////////////求next
int j=;
next[]=;
for(int i=;i<m;i++)
{
while(j!=&&t[j]!=t[i]) j=next[j-];
if(t[j]==t[i]) j++;
next[i]=j;
} ///////////////////// j=;
int ans=-;
for(int i=;i<n;i++)
{
while(j!=&&s[i]!=t[j]) j=next[j-];
if(s[i]==t[j]) j++;
if(j==m)
{
ans=i+-m+;
break;
}
} ///////////////////
if(ans==-)
printf("-1\n");
else
printf("%d\n",ans);
}
return ;
} // 扩展kmp。
#defien N int next[N],sum[N];// sum用来记录 void build(char s[])
{
memset(next,,sizeof(next));
int p=,a=;
next[]=len;
for(int i=;i<len;i++)
{
if(i+next[i-a]-<p)
{
next[i]=next[i-a];
}
else
{
int k=p-i;
while(p+<len && s[p+]==s[k+])
{
p++; k++;
}
p=max(p,i);
next[i]=k+;
a=i;
}
}
} void extend_kmp(char s[],char t[])//求从s到t上的最大前缀
{
memset(sum,,sizeof(sum));
int p=-,a=;
for(int i=;i<len;i++)
{
if(i+next[i-a]-<p)
{
sum[i]=next[i-a];
}
else
{
int k=p-i;
while(p+<len && s[p+]==t[k+])
{
p++; k++;
}
p=max(p,i);
sum[i]=k+;
a=i;
}
}
}
最小表示法
int mistr(char s[],int len) //输入一串字符,返回最小表示法的起始位置
{
int i=,j=,k=;
while(i<len&&j<len&&k<len)
{
if(s[i+k]==s[j+k])
{
k++;
}
else
{
if(s[i+k] > s[j+k]) i=i+k+;
if(s[i+k] < s[j+k]) j=j+k+;
k=;
if(i==j) j++;
}
}
return min(i,j);
}
Manacher模板,kmp,扩展kmp,最小表示法模板的更多相关文章
- [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher 题解报告
来刷kuangbin字符串了,字符串处理在ACM中是很重要的,一般比赛都会都1——2道有关字符串处理的题目,而且不会很难的那种,大多数时候都是用到一些KMP的性质或者找规律. 点击标题可跳转至VJ比赛 ...
- 【KMP】【最小表示法】NCPC 2014 H clock pictures
题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...
- 浅谈Manacher算法与扩展KMP之间的联系
首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解.网上解法颇多.时间复杂度也不尽同样,这里列述几种常见的解法. 解法一 ...
- P5410 【模板】扩展 KMP
P5410 [模板]扩展 KMP #include<bits/stdc++.h> using namespace std; ; int q, nxt[maxn], extend[maxn] ...
- 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)
题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...
- kuangbin专题十六 KMP&&扩展KMP HDU2609 How many (最小字符串表示法)
Give you n ( n < 10000) necklaces ,the length of necklace will not large than 100,tell me How man ...
- 【string】KMP, 扩展KMP,trie,SA,ACAM,SAM,最小表示法
[KMP] 学习KMP,我们先要知道KMP是干什么的. KMP?KMPLAYER?看**? 正如AC自动机,KMP为什么要叫KMP是因为它是由三个人共同研究得到的- .- 啊跑题了. KMP就是给出一 ...
- ACM之路(12)—— KMP & 扩展KMP & Manacher
最近做完了kuangbin的一套关于kmp的题目(除了一道字典树的不会,因为还没学字典树所以先放放),做个总结.(kuangbin题目的链接:http://acm.hust.edu.cn/vjudge ...
- Kuangbin 带你飞 KMP扩展KMP Manacher
首先是几份模版 KMP void kmp_pre(char x[],int m,int fail[]) { int i,j; j = fail[] = -; i = ; while (i < m ...
随机推荐
- Cocos2d-X中的ZORDER和Tag
ZORDER:是描写叙述渲染顺序的值,每一个CCNode都有ZORDER,默认是0 ZORDER越大,越后面绘制 假设ZORDER同样.那么看arrival顺序.先增加的节点先绘制 ZORDER仅仅在 ...
- linux任务计划cron
linux任务计划cron 1.crontab命令任务计划配置文件 [root@bogon ~]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/ ...
- redis安装和配置(一)
Redis 的官方下载站是http://redis.io/download 怎么安装 Redis 数据库呢?下面将介绍Linux 版本的安装方法 步骤一: 下载Redis 下载安装包:wget htt ...
- 点滴积累【JS】---JS小功能(setInterval实现图片效果显示时间)
效果: 代码: <head runat="server"> <title></title> <script type="text ...
- EHCache 在WEB项目的使用方法
EHCache 是一个纯java的在进程中的缓存,它具有下面特性:高速,简单,为Hibernate2.1充当可插入的缓存,最小的依赖性,全面的文档和測试.官方站点http://ehcache.sour ...
- Codeforces 455C Civilization(并查集+dfs)
题目链接:Codeforces 455C Civilization 题目大意:给定N.M和Q,N表示有N个城市,M条已经修好的路,修好的路是不能改变的.然后是Q次操作.操作分为两种.一种是查询城市x所 ...
- Django--ORM基础
ORM(映射关系) 映射关系: 表名 <-------> 类名 字段 <-------> 属性 表记录 <------->类实例对象 创建表(建立模型) 在Djan ...
- 新标准C++程序设计读书笔记_继承和多态
简单继承的例子: #include <iostream> #include <string> using namespace std; class CStudent { pri ...
- neo4j使用笔记
#coding:utf- __author__ = 'similarface' # 安装驱动:pip install neo4j-driver from neo4j.v1 import GraphDa ...
- 5.14日学习内容1:jquery表单相关知识
<script> $comment.animate({height:'+=50'},400);//在原来的基础上加50: $('.smaller').click(function(){ i ...