zoukankan      html  css  js  c++  java
  • Uva 12206 Stammering Aliens

    题目描述

    输入输出格式

    输入格式:

    输出格式:

    输入输出样例

    输入样例#1: 
    3
    baaaababababbababbab
    11
    baaaababababbababbab
    3
    cccccc
    0
    输出样例#1: 
    5 12
    none
    4 2


    这个题后缀数组或者二分+hash好像都能做,,,但是我只是练一下后缀自动机而已hhhhh
    这个题我们求的显然就是right集合大小>=m的max{}的最大值,至于求最右开端的话,我们只需要记录一下
    right集合的最右点是哪个就行了,然后用这个减去答案长度就是最右开端。

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    #define maxn 170005
    using namespace std;
    int l[maxn],siz[maxn],n,r[maxn];
    int cnt=1,pre=1,m,ans,pos;
    int ch[maxn][26],f[maxn];
    int a[maxn],c[maxn];
    char s[maxn];
    
    inline void init(){
    	memset(ch,0,sizeof(ch));
    	memset(f,0,sizeof(f));
    	memset(c,0,sizeof(c));
    	memset(siz,0,sizeof(siz));
    	memset(r,0,sizeof(r));
    	cnt=pre=1,l[1]=siz[1]=0;
    	ans=pos=0;
    }
    
    inline void ins(int x){
    	int p=pre,np=++cnt;
    	pre=np,l[np]=l[p]+1;
    	siz[np]=1,r[np]=l[np];
    	
    	for(;p&&!ch[p][x];p=f[p]) ch[p][x]=np;
    	if(!p) f[np]=1;
    	else{
    		int q=ch[p][x];
    		if(l[q]==l[p]+1) f[np]=q;
    		else{
    			int nq=++cnt;
    			l[nq]=l[p]+1;
    			memcpy(ch[nq],ch[q],sizeof(ch[q]));
    			f[nq]=f[q];
    			f[q]=f[np]=nq;
    			for(;ch[p][x]==q;p=f[p]) ch[p][x]=nq;
    		}
    	}
    }
    
    inline void build(){
    	for(int i=0;i<n;i++) ins(s[i]-'a');
    	for(int i=1;i<=cnt;i++) c[l[i]]++;
    	for(int i=n;i>=0;i--) c[i]+=c[i+1];
    	for(int i=1;i<=cnt;i++) a[c[l[i]]--]=i;
    }
    
    inline void solve(){
    	for(int i=1;i<=cnt;i++){
    		int now=a[i];
    		siz[f[now]]+=siz[now];
    		r[f[now]]=max(r[f[now]],r[now]);
    		if(l[now]&&siz[now]>=m){
    			if(l[now]>ans) ans=l[now],pos=r[now];
    			else if(ans==l[now]&&r[now]>pos) pos=r[now];
    		}
    	}
    }
    
    int main(){
    	while(scanf("%d",&m)==1&&m){
    		scanf("%s",s),n=strlen(s);
    		init();
    		build();
    		solve();
    		if(ans) printf("%d %d
    ",ans,pos-ans);
    		else puts("none");
    	}
    	
    	return 0;
    }
    
    
    

      



  • 相关阅读:
    三次请求(读-改-读)引出nibernate 一级缓存
    算法竞赛入门经典第一、二章摘记
    uva 10905 Children's Game
    uva 11205 The broken pedometer
    uva 10160 Servicing stations
    uva 208 Firetruck
    uva 167 The Sultan's Successors
    zoj 1016 Parencodings
    uva 307 Sticks
    uva 216 Getting in Line
  • 原文地址:https://www.cnblogs.com/JYYHH/p/8456575.html
Copyright © 2011-2022 走看看