// 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. Win7 + vs2012 + cocos2d-x2.2 配置开发环境

    昨天開始打算学习Cocos2d-x,首先肯定是要在自己的电脑上配置开发环境.昨天折腾了一天,以下将自己在当中遇到的问题与解决方法跟大家分享一下.大多数会遇到的问题,我都遇到了....     1.安装 ...

  2. git团队协作流程

    创建项目,在github上增加一个repository,在要提交的工程目录下打开git bash,执行git init 命令,用于初始化,可使用git status 查看git状态,然后使用git a ...

  3. 通过使用JanusGraph索引提高性能

    翻译整理:纪玉奇 Extending JanusGraph Server JanusGraph支持两种类型的索引:graph index和vertex-centric index.graph inde ...

  4. Node.js搭建本地web服务(转)

    http://www.cnblogs.com/wangfupeng1988/p/4143996.html https://github.com/finderL/webserver

  5. 在intellij中使用checkStyle进行代码规范

    1 编写代码检测规则可以参考阿里和google的规则和checkstyle的官网文档.checkstyle官网地址http://checkstyle.sourceforge.net/ 假设自己的sty ...

  6. JUC组件扩展(二)-JAVA并行框架Fork/Join(四):监控Fork/Join池

    Fork/Join 框架是为了解决可以使用 divide 和 conquer 技术,使用 fork() 和 join() 操作把任务分成小块的问题而设计的.主要实现这个行为的是 ForkJoinPoo ...

  7. 在centos 5.11上安装pylint

    上午花了两三个小时在折腾pylint的安装. 如果是普通的linux倒也简单,只用运行一个pip install pylint就行了. 可是偏偏那么巧,服务器的版本是centos 5.11 这个版本对 ...

  8. Atitit.js模块化 atiImport 的新特性javascript import

    Atitit.js模块化 atiImport 的新特性javascript import 1. 常见的js import规范amd ,cmd ,umd1 1.1. Require更多流行3 2. at ...

  9. erlang supervisor中启动普通的进程

    文字部分转自: http://1234n.com/?post/qou3eb supervisor的子进程 一开始使用supervisor的时候,我用的是init/1返回子进程规格列表的方式,并且所有子 ...

  10. 0046 @Transactional注解的几个参数--事务传播控制--事务隔离级别--异常与回滚

    @Transactianal注解有一些属性,见Spring-Framework-Reference Table17.3 Transactional-settings @Transactional(pr ...