// 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,最小表示法模板的更多相关文章

  1. [kuangbin带你飞]专题十六 KMP & 扩展KMP & Manacher 题解报告

    来刷kuangbin字符串了,字符串处理在ACM中是很重要的,一般比赛都会都1——2道有关字符串处理的题目,而且不会很难的那种,大多数时候都是用到一些KMP的性质或者找规律. 点击标题可跳转至VJ比赛 ...

  2. 【KMP】【最小表示法】NCPC 2014 H clock pictures

    题目链接: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1794 题目大意: 两个无刻度的钟面,每个上面有N根针(N<=200000),每个 ...

  3. 浅谈Manacher算法与扩展KMP之间的联系

    首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解.网上解法颇多.时间复杂度也不尽同样,这里列述几种常见的解法. 解法一   ...

  4. P5410 【模板】扩展 KMP

    P5410 [模板]扩展 KMP #include<bits/stdc++.h> using namespace std; ; int q, nxt[maxn], extend[maxn] ...

  5. 题解-洛谷P5410 【模板】扩展 KMP(Z 函数)

    题面 洛谷P5410 [模板]扩展 KMP(Z 函数) 给定两个字符串 \(a,b\),要求出两个数组:\(b\) 的 \(z\) 函数数组 \(z\).\(b\) 与 \(a\) 的每一个后缀的 L ...

  6. 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 ...

  7. 【string】KMP, 扩展KMP,trie,SA,ACAM,SAM,最小表示法

    [KMP] 学习KMP,我们先要知道KMP是干什么的. KMP?KMPLAYER?看**? 正如AC自动机,KMP为什么要叫KMP是因为它是由三个人共同研究得到的- .- 啊跑题了. KMP就是给出一 ...

  8. ACM之路(12)—— KMP & 扩展KMP & Manacher

    最近做完了kuangbin的一套关于kmp的题目(除了一道字典树的不会,因为还没学字典树所以先放放),做个总结.(kuangbin题目的链接:http://acm.hust.edu.cn/vjudge ...

  9. Kuangbin 带你飞 KMP扩展KMP Manacher

    首先是几份模版 KMP void kmp_pre(char x[],int m,int fail[]) { int i,j; j = fail[] = -; i = ; while (i < m ...

随机推荐

  1. android的五大布局(layout)

    Android的界面是有布局和组件协同完成的,布局好比是建筑里的框架,而组件则相当于建 筑里的砖瓦.组件按照布局的要求依次排列,就组成了用户所看见的界面.Android的五大布局分别是LinearLa ...

  2. kettle--组件(2)--计算器

    组件如下: 对计算类型的说明如下: The table below contains descriptions associated with the calculator step: Functio ...

  3. 使用AsParallel 进行并行化处理数据

    using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using S ...

  4. Mysql删除重复数据保留最小的id

    在网上查找删除重复数据保留id最小的数据,方法如下: DELETE FROM people WHERE peopleName IN ( SELECT peopleName FROM people GR ...

  5. ssl证书文件

    证书(Certificate) - *.cer *.crt私钥(Private Key) - *.key证书签名请求(Certificate signing request) - *.csr 至于pe ...

  6. ubuntu命令改变文档权限和所有者

    chgrp :改变档案所属群组 chown :改变档案拥有者 chmod :改变档案的权限, SUID, SGID, SBIT等等的特性,可读.可写.可执行 1 chgrp 例子 chgrp [-R] ...

  7. linux 环境下git的安装与配置

    git是一个分布式的版本控制工具 1.安装git相关的依赖 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-de ...

  8. Unity中差乘判断目标是否在左边或右边

    使用差乘判断左右一般是比较差乘的y,小于0是左,大于0是右.特殊情况可以用其他分量来比较 默认情况: var cross = Vector3.Cross(lhsObject.transform.pos ...

  9. Atitit php序列化 php的serialize序列化和json序列化

    Atitit php序列化 php的serialize序列化和json序列化 PHP 对不同类型的数据用不同的字母进行标示,Yahoo 开发网站提供的Using Serialized PHP with ...

  10. Vivado使用技巧:封装自己设计的IP核

    概述   Vivado在设计时可以感觉到一种趋势,它鼓励用IP核的方式进行设计.“IP Integrator”提供了原理图设计的方式,只需要在其中调用设计好的IP核连线.IP核一部分来自于Xilinx ...