51nod 1277 字符串中的最大值(KMP算法)

分析:

KMP算法:参考http://www.cnblogs.com/c-cloud/p/3224788.html,是一个线性处理字符串匹配问题的算法

在这里利用到next数组,记t[i]为长度为i的前缀出现的次数,显然t[n]=1。next[i]即为子串[0,i]的后缀与前缀重复的最长长度,因此可以统计一下next[i]的取值的个数,然后较长的前缀出现一次代表较短的前缀也一次,递推一下即可,复杂度为O(n)。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 using namespace std;
 5 const int maxn=1e5+5;
 6 typedef long long ll;
 7 int n,next[maxn],t[maxn];
 8 char s[maxn];
 9 int main(){
10    // freopen("e:\\in.txt","r",stdin);
11     cin>>s;
12     n=strlen(s);
13     memset(next,0,sizeof(next));
14     memset(t,0,sizeof(t));
15     int q,k;
16     for(q=1,k=0;q<n;q++){
17         while(k>0&&s[q]!=s[k]){
18             k=next[k-1];
19         }
20         if(s[k]==s[q])
21             k++;
22         next[q]=k;
23     }
24     for(int i=n;i>0;i--){
25         t[i]++;
26         t[next[i-1]]+=t[i];
27     }
28     ll ans=0;
29     for(int i=1;i<=n;i++){
30         if((ll)t[i]*i>ans)ans=(ll)t[i]*i;
31     }
32     cout<<ans<<endl;
33     return 0;
34 }
时间: 2024-10-10 14:00:53

51nod 1277 字符串中的最大值(KMP算法)的相关文章

51Nod 1277 字符串中的最大值(KMP,裸题)

1277 字符串中的最大值 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd. 给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值. 例如:S = "abababa" 所有的前缀如下: "a", 长度与出现次数的乘积 1 * 4 = 4, "ab",长度与出

51Nod 1277 字符串中的最大值 ( KMP &amp;&amp; DP )

题意 : 一个字符串的前缀是指包含该字符第一个字母的连续子串,例如:abcd的所有前缀为a, ab, abc, abcd.给出一个字符串S,求其所有前缀中,字符长度与出现次数的乘积的最大值.例如:S = "abababa" 所有的前缀如下: "a", 长度与出现次数的乘积 1 * 4 = 4, "ab",长度与出现次数的乘积 2 * 3 = 6, "aba", 长度与出现次数的乘积 3 * 3 = 9, "abab&

51nod 1277 字符串中的最大值

题目链接 51nod 1277 字符串中的最大值 题解 对于单串,考虑多串的fail树,发现next数组的关系形成树形结构 建出next树,对于每一个前缀,他出现的次数就是他子树的大小 代码 #include<cstdio> #include<cstring> #include<algorithm> inline int read() { int x = 0,f = 1; char c = getchar(); while(c < '0' || c > '9

子字符串查找之————关于KMP算法你不知道的事

写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法.即通过next数组来作为有限状态自动机,以此实现非匹配时的回退.这不失为一种好的方法. 但我们接下来要见识的是一种更好和更完整的方法————拥有完整DFA的KMP算法 先列出本文要介绍的方法与一般方法对比下的几大优点: 在最坏情况下,对字符串的操作次数仅为一般做法的三分之二. 在所有情况下,对字符

数据结构之 字符串---字符串匹配(kmp算法)

串结构练习——字符串匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定两个字符串string1和string2,判断string2是否为string1的子串. 输入 输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格. 输出 对于每组输入数据,若string2是string1的子串,则输出"YES",否则输出"NO". 示例输入

处理字符串中逗号的js算法,3种(前端网备份)

<!DOCTYPE html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>111</title> </head> <body class="gray-bg&qu

poj2406(求字符串的周期,kmp算法next数组的应用)

题目链接:https://vjudge.net/problem/POJ-2406 题意:求出给定字符串的周期,和poj1961类似. 思路:直接利用next数组的定义即可,当没有周期时,周期即为1. AC代码: #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1e6+5; int n,nex[maxn],len; char s[maxn]

计算子串在主串中的位置及其优化(KMP算法)

问题描述:设置一个起始位置,寻找主串中第一次出现子串的首位置. 算法实现: int index(string str,string substr,int pos) { int i=0,j=0; int slen,sslen; i=pos; slen=str.length(); sslen=substr.length(); while(i+sslen<slen) { while(j<sslen) { if(str[i+j]==substr[j]) j++; else break; } if(j=

BF算法与KMP算法

BF(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符:若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果. BF算法实现: 1 int BF(char S[],char T[],int pos) 2 {//c从第pos位开始搜索匹配 3 int i=pos,j=0; 4 while(S[i+j]!='\0'&&T[j]!='\0')