hdu 4552 怪盗基德的挑战书

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4552

 

这个用java写的超时

import java.util.Scanner;

public class Main{
	public static void main(String[] args) {
		Scanner input=new Scanner(System.in);
		while(input.hasNext()){
			String s=input.next();
			int sum=0;
			for(int i=0;i<s.length();i++){
				String b=s.substring(0, i+1);
				for(int j=0;j<=s.length()-b.length();){
					if(s.indexOf(b, j)!=-1){
						j=s.indexOf(b, j)+1;
							sum++;
					}
					else
						break;
				}
			}
			System.out.println(sum%256);
		}
	}
}


这个用C写的,已AC

#include<stdio.h>
#include<string.h>
#define N 100005
#define MOD 256
char str[N];
int lenstr;
int sa[N],height[N],rank[N],tmp[N],top[N];
void makesa(){
	int i,j,n,len,na;
	n=lenstr+1;
	str[n-1]=0;
	na=(n<256?256:n);
	memset(top,0,na*sizeof(int));
	for(i=0;i<n;i++){
		top[rank[i]=str[i]&0xff]++;
	}
	for(i=1;i<na;i++){
		top[i]+=top[i-1];
	}
	for(i=0;i<n;i++){
		sa[--top[rank[i]]]=i;
	}
	for(len=1;len<n;len<<=1){
		for(i=0;i<n;i++){
			j=sa[i]-len;
			if(j<0){
				j+=n;
			}
			tmp[top[rank[j]]++]=j;
		}
		sa[tmp[top[0]=0]]=j=0;
		for(i=1;i<n;i++){
			if(rank[tmp[i]]!=rank[tmp[i-1]]||rank[tmp[i]+len]!=rank[tmp[i-1]+len]){
				top[++j]=i;
			}
			sa[tmp[i]]=j;
		}
		memcpy(rank,sa,n*sizeof(int));
		memcpy(sa,tmp,n*sizeof(int));
		if(j>=n-1){
			break;
		}
	}
}
void lcp(){
	int i,j,k,n=lenstr+1;
	for(j=rank[height[i=k=0]=0];i<n-1;i++,k++){
		while(k>=0&&str[i]!=str[sa[j-1]+k]){
			height[j]=k--;
			j=rank[sa[j]+1];
		}
	}
}
int main(){
	int i;
	int ans,temp;
	while(scanf("%s",str)!=EOF){
		lenstr=strlen(str);
		makesa();
		lcp();
		ans=lenstr%MOD;
		for(temp=lenstr,i=rank[0]+1;i<=lenstr;i++){
			if(temp>height[i]){
				temp=height[i];
			}
			if(temp==0){
				break;
			}
			ans+=temp;
			ans%=MOD;
		}	
		for(temp=lenstr,i=rank[0];i>1;i--){
			if(temp>height[i]){
				temp=height[i];
			}
			if(temp==0){
				break;
			}
			ans+=temp;
			ans%=MOD;
		}
		printf("%d\n",ans);
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值