HDU 4763 数据结构之KMP+二分
2016-03-22 20:45
330 查看
点击打开链接
题意:求最长的开头与结尾,然后中间还有一样的,但是不能重复利用一个字符
思路:用KMP的next数组,然后用二分求最大值,具体看二分就行了#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1000010;
char str1[maxn];
int Next[maxn],len;
void makenext(int m){
int i=0,j=-1;
Next[i]=-1;
while(i<m){
if(j==-1||str1[i]==str1[j])
Next[++i]=++j;
else j=Next[j];
}
}
bool judge(int x){
if(Next[len]<x||x>=(len+3)/3) return 0;//不符合题目的要求
bool flag=0;
for(int i=2*x;i<=len-x;i++){
if(Next[i]>=x){//如果Next数组的值大于或等于x就成立,因为next数组代表的是与前面的匹配程度嘛,利用它的性质做题很有必要
flag=1;break;//为什么从2*x开始是因为当前面的串是这样的时候,aaaaabaaa;x=3;这时Next数组的4已经等于3了,但是不满足
}
}
if(flag) return 1;
else return 0;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%s",str1);
len=strlen(str1);
makenext(len);
int le=0,ri=350000;
int ans=0;
while(ri-le>1){
int mid=(le+ri)>>1;
if(judge(mid)) le=mid,ans=mid;
else ri=mid;
}
printf("%d\n",ans);
}
return 0;
}
题意:求最长的开头与结尾,然后中间还有一样的,但是不能重复利用一个字符
思路:用KMP的next数组,然后用二分求最大值,具体看二分就行了#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=1000010;
char str1[maxn];
int Next[maxn],len;
void makenext(int m){
int i=0,j=-1;
Next[i]=-1;
while(i<m){
if(j==-1||str1[i]==str1[j])
Next[++i]=++j;
else j=Next[j];
}
}
bool judge(int x){
if(Next[len]<x||x>=(len+3)/3) return 0;//不符合题目的要求
bool flag=0;
for(int i=2*x;i<=len-x;i++){
if(Next[i]>=x){//如果Next数组的值大于或等于x就成立,因为next数组代表的是与前面的匹配程度嘛,利用它的性质做题很有必要
flag=1;break;//为什么从2*x开始是因为当前面的串是这样的时候,aaaaabaaa;x=3;这时Next数组的4已经等于3了,但是不满足
}
}
if(flag) return 1;
else return 0;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%s",str1);
len=strlen(str1);
makenext(len);
int le=0,ri=350000;
int ans=0;
while(ri-le>1){
int mid=(le+ri)>>1;
if(judge(mid)) le=mid,ans=mid;
else ri=mid;
}
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Java数据结构及算法实例:插入排序 Insertion Sort
- Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture
- java数据结构之java实现栈
- java数据结构之实现双向链表的示例
- Java数据结构及算法实例:选择排序 Selection Sort
- Java数据结构及算法实例:朴素字符匹配 Brute Force
- Java数据结构及算法实例:汉诺塔问题 Hanoi
- Java数据结构及算法实例:快速计算二进制数中1的个数(Fast Bit Counting)