UVA 10829(后缀数组)
来源:互联网 发布:linux select c代码 编辑:程序博客网 时间:2024/06/02 21:24
(http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105595#problem/B)
题意:有点复杂,大意是在串s中找到形如’UVU’的子串,其中V长度给定,求U的最大长度。
解法:不满足二分的性质,只能枚举U的长度,注意到,当U的长度为L时,U必定包含0,L,2L……这些位置其中之一,因此只需枚举这些位置,时间复杂度为nlgn.
#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>#include <vector>using namespace std;#define ll long long#define inf 1e18#define clr(x,y) memset(x,y,sizeof x)#define FOR(i,a,b) \ for(i=a;a<b?i<=b:i>=b;a<b?i++:i--)const int maxn = 50000*2+20;struct suffix_array{ char s[maxn]; int sa[maxn] , t[maxn] , t2[maxn] , c[maxn]; int n; void build_sa(int m) { int i,*x=t,*y=t2; FOR(i,0,m-1) c[i]=0; FOR(i,0,n-1) c[x[i]=s[i]]++; FOR(i,1,m-1) c[i]+=c[i-1]; FOR(i,n-1,0) sa[--c[x[i]]]=i; for(int k=1;k<=n;k++) { int p=0; FOR(i,n-k,n-1) y[p++]=i; FOR(i,0,n-1) if(sa[i]>=k) y[p++]=sa[i]-k; FOR(i,0,m-1) c[i]=0; FOR(i,0,n-1) c[x[y[i]]]++; FOR(i,0,m-1) c[i]+=c[i-1]; FOR(i,n-1,0) sa[--c[x[y[i]]]]=y[i]; swap(x,y); p=1; x[sa[0]]=0; FOR(i,1,n-1) x[sa[i]]=y[sa[i-1]]==y[sa[i]] && y[sa[i-1]+k]==y[sa[i]+k]?p-1:p++; if(p>=n) break; m=p; } } int Rank[maxn] , height[maxn]; void getHeight(){ int k=0; for(int i=0;i<n;i++) Rank[sa[i]]=i; for(int i=0;i<n;i++) { if(k) k--; int j=sa[Rank[i]-1]; while(s[i+k]==s[j+k]) k++; height[Rank[i]]=k; } } int d[maxn][20] , flog[maxn]; void RMQ_init() { for(int i=0;i<n;i++) d[i][0] = height[i]; flog[0]=-1; for(int i=1;i<=n;i++) flog[i]=flog[i>>1]+1; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<j)<=n;i++) d[i][j] = min(d[i][j-1],d[i+(1<<(j-1))][j-1]); } int RMQ(int L,int R) { int k = flog[R-L+1]; return min(d[L][k],d[R-(1<<k)+1][k]); } int lcp(int j,int k) { if(j==k) return n-k; if( Rank[j] > Rank[k] ) swap(j,k); return RMQ(Rank[j]+1,Rank[k]); } void init(char *ss) { strcpy(s,ss); n=strlen(s)+1; build_sa(255); getHeight();// for(int i=0;i<n;i++)// printf("%s %d %d\n",s+sa[i],sa[i],height[i]); RMQ_init(); }}su,su2;char s[maxn],s2[maxn];int g;void Rev(char *s){ int l=0,r=strlen(s)-1; while( l<r ) swap(s[l++],s[r--]);}int main(){ //freopen("input.txt","r",stdin); //freopen("output.txt","w",stdout); int T,CASE=0; scanf("%d",&T); while(T--) { scanf("%d%s",&g,s); strcpy(s2,s); Rev(s2); int len = strlen(s); su.init(s); su2.init(s2); ll ans=0; for(int l=1;l<=len;l++) {// printf("l %d\n",l); for(int i=0;i+g+l<len;i+=l) { ans += (ll)max( min(l,su.lcp(i,i+g+l)) + min(l,su2.lcp(len-i-1,len-(i+g+l)-1))-1-l+1 , 0 ); } } printf("Case %d: %lld\n",++CASE,ans); } return 0;}
0 0
- UVA 10829(后缀数组)
- UVa 10829 后缀数组+RMQ
- UVA 11107(后缀数组)
- UVA 10829 L-Gap Substrings(后缀数组好题)
- UVa 10829 - L-Gap Substrings (后缀数组)
- UVA 10829 L-Gap Substrings(后缀数组)
- UVA 10829 - L-Gap Substrings(后缀数组)
- uva 10829 - L-Gap Substrings(后缀数组)
- UVA 10829 L-Gap Substrings 后缀数组
- UVA 10829 后缀数组+技巧计数
- UVA 1314-Hidden Password(后缀数组)
- uva 11107 Life Forms(后缀数组)
- UVA 11855 - Buzzwords(后缀数组)
- uva 11855 - Buzzwords(后缀数组)
- UVA 10829 L-Gap Substrings(后缀数组+枚举区间优化)
- UVA 10829 L-Gap Substrings (后缀数组+RMQ)
- UVA 11107 Life Forms (后缀数组 + 二份答案)
- UVA 11107 Life Forms(后缀数组 OR hash)
- Atitit.跨语言系统服务管理器api兼容设计
- audiopolicy分析
- Hadoop join 关联提升版 开发代码调整解决 reduce时候 OOM问题
- Struts2 HelloWorld
- audiotrack分析
- UVA 10829(后缀数组)
- 基础练习 杨辉三角形
- Ubuntu14.04 配置静态ip地址
- Java Socket网络编程的经典例子
- Struts2之访问ServletAPI
- audio的输出设备切换分析
- Android界面之ActivityGroup的使用
- 周易六十四卦——谦卦
- Java 入门 之 聊天室项目思路 客户端