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 ...
随机推荐
- Android实现截图分享qq,微信
代码地址如下:http://www.demodashi.com/demo/13292.html 前言 现在很多应用都有截图分享的功能,今天就来讲讲截图分享吧 今天涉及到以下内容: android权限设 ...
- GTK入门学习:布局容器之固定布局
前面我们学习的水平.垂直和表格布局容器,控件会跟着容器大小的变化进行自己主动适应.而固定布局容器里的控件则不会跟着变化( 则固定不变 ). 固定布局的创建: GtkWidget *gtk_fixed_ ...
- blender,沿某一轴缩放
scale是等比缩放,要想沿某一轴缩放按一下s+z,或s+x,或s+y.
- Spring Boot(四):利用devtools实现热部署,改动代码自动生效
一.前言 spring-boot-devtools是一个为开发者服务的一个模块,其中最重要的功能就是自动应用代码更改到最新的App上面去.原理是在发现代码有更改之后,重新启动应用,但是速度比手动停止后 ...
- ubuntu12.04打开某一个已安装的软件的方法
1.快捷键win+A,里面显示已安装的软件 2.打开左上角的dash home,即ubuntu标志图,输入想要打开的软件 还有其它方法,探索中... .
- make之eval函数
函数原型: $(eval text) 它的意思是 text 的内容将作为makefile的一部分而被make解析和执行. 需要注意的是该函数在执行时会对它的参数进行两次展开,第一次展开是由函数本身完成 ...
- linux 从百度网盘下载文件的方法
linux 从百度网盘下载文件的方法 发表于2015 年 月 日由shenwang 方法1.wget wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括 ...
- 李洪强iOS开发之Xcode快捷键
14个Xcode中常用的快捷键操作 在Xcode 6中有许多快捷键的设定可以使得你的编程工作更为高效,对于在代码文件中快速导航.定位Bug以及新增应用特性都是极有效的. 当然,你戳进这篇文章的目的 ...
- javascript构造函数的理解
构造函数是在javascript文档的创建对象当中提到的,主要目的是为了解决代码复用,能够大量产生同类型而多作用的方法 在javascript中给出了几种创建对象的模式: 1.对象字面量 例: var ...
- IE首页被篡改(手动修复)
所谓手动修复,即以不变应万变,修改注册表,其实工具软件也只是帮你代工而已. win + R 打开 “运行”,键入 “regedit.exe” 打开注册表编辑器,在 路径 HKEY_LOCAL_MACH ...