题目链接: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;
}