spoj.pl/problems/DSUBSEQ/
# include<stdio.h>
# include<stdlib.h>
int main(){
long i,*sum,len,*last;
int test;
char c,*hold=(char *)malloc(sizeof(char)*100001);
sum=(long *)calloc(100001,sizeof(long));
last=(long *)calloc(26,sizeof(long));
scanf("%d",&test);
getchar();
while(test){
i=0;
while(1){
c=getchar();
if(c<65 || c>90)
break;
hold[i]=c;
i++;
}
len=i;
hold[i]='\0';
for(i=0;i<26;i++)
last[i]=0;
for(i=0;i<=len;i++)
sum[i]=0;
sum[0]=1;
for(i=1;i<=len;i++){
if(last[hold[i-1]-65]>0)
sum[i]=(2*sum[i-1]-sum[last[hold[i-1]-65]-1])%1000000007;
else
sum[i]=(2*sum[i-1])%1000000007;
last[hold[i-1]-65]=i;
}
printf("%ld\n",sum[len]);
test--;
}
return 0;
}
i guess this miss some corner case.can someone tell me whats that?