hdu5510 kmp+二分
来源:互联网 发布:本机端口号查询 编辑:程序博客网 时间:2024/05/30 22:53
//给出n个字符串,找出最大的i//使得在(1<=j<i)的范围内有字符串不是i的子串//从n-1开始往前推,如果字符串j是字符串str[n]的子串//那么字符串j是在字符串n的哪个区间范围内//存下前面所有字符串在字符串n的所有区间//然后可以用二分找到第一个不包含这个区间的前面的区间#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std ;const int maxn = 2010 ;char str[maxn][maxn] ;int l[maxn] , r[maxn] , id[maxn] ;int Next[maxn] ;void get_next(int p){ int n = strlen(str[p]) ; Next[0] = -1 ; int j = 0 ; int k = -1 ; while(j < n) { if(k == -1 || str[p][j] == str[p][k]){ j++ ; k++ ; Next[j] = k; } else k = Next[k] ; }}int kmp(int p , int x){ int n = strlen(str[x]) ; int m = strlen(str[p]) ; int i =0 , j = 0 ; while(i < n && j < m) { if(j == -1 || str[p][j] == str[x][i]) i++ ,j++ ; else j = Next[j] ; } return j == m ? i - j + 1 : -1 ;}int find(int x , int len){ int lx = 0 ; int rx = len-1 ; while(lx<=rx) { int mid = (lx + rx) >> 1 ; if(r[mid] >= x) lx = mid + 1 ; else rx = mid - 1 ; } return lx ;}int main(){ //freopen("d:\\in.txt" , "r" , stdin) ; int t ; scanf("%d" , &t) ; int cas = 0 ; while(t--) { int n ; scanf("%d" , &n) ; int ans = -1 ; for(int i = 1;i <= n;i++) scanf("%s" , str[i]) ; int len = 0 ; for(int i = n-1;i >= 1;i--){ int x = strlen(str[i]) ; get_next(i) ; int pos = kmp(i,n) ; if(pos == -1){ ans = n ; break ; } int px = upper_bound(l,l+len,pos)-l ; int py = find(pos+x-1,len); int tmp = min(px , py) ; if(tmp == len){ l[len] = pos ; r[len] = pos+x-1 ; id[len++] = i; } else ans = max(ans , id[tmp]) ; } printf("Case #%d: %d\n" , ++cas , ans) ; } return 0 ;}
0 0
- hdu5510 kmp+二分
- hdu5510 (KMP+剪枝)
- HDU5510 Bazinga KMP+剪枝
- HDU5510(KMP)
- 【KMP+暴力】Bazinga hdu5510
- HDU5510 - Bazinga (kmp+暴力)
- hdu5510(并查集+KMP)
- hdu5510
- hdu5510-沈阳区域赛 Bazinga【KMP】
- hdu5510 Bazinga
- HDU5510 Bazinga
- hdu5510 Bazinga 暴力+剪枝
- HDU5510 Bazinga (strstr())
- 【HDU5510 2015沈阳赛区B】【KMP or strstr for循环剪枝】Bazinga 循环处思维灵活转化 时间复杂度均摊思想
- HDU5510 Bazinga 暴力strstr+剪枝
- HDU5510-思维-字符串匹配剪枝
- poj 1226 Substrings(二分 + kmp)
- poj 3080 Blue Jeans ( 二分 + kmp)
- 【线性代数公开课MIT Linear Algebra】 第十七课 正交基和正交矩阵
- Http和Https简介
- poj 3461 Oulipo
- Struts2和Spring的mvc的区别
- LightOJ 1297 - Largest Box (二分查找)
- hdu5510 kmp+二分
- [004]微信公众账号开发教程第1篇-根据用户openID获取用户基本信息
- PHP与JavaScript在处理数组方面的不同之处
- [Unity热更新]lua基础(一)
- poj 2752 Seek the Name, Seek the Fame
- 如何解决ArcGIS Runtime SDK for Android中文标注无法显示的问题
- ArcGIS for Server内置JS Viewer的离线部署和配置
- ArcGIS for Server 10.3.X 新型紧凑型缓存的解读和应用
- 浅窥ArcGIS Data Store之两斑