Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- void Suffix(char *str, int* suffix)
- {
- int t,i,l;
- l=strlen(str);
- suffix[l-1]=t=l-1;
- i=l-2;
- while(i>=0){
- while((t<(l-1)) && (str[t] != str[i]))
- t=suffix[t+1];
- if(str[t]==str[i])
- t--;
- suffix[i]=t;
- i--;
- }
- }
- void Delta1(char *str, int *arr)
- {
- int a, l, j, i;
- a=0;
- l=strlen(str);
- while(a<128){
- arr[a]=l;
- a++;
- }
- j=0;
- while(j<l){
- arr[str[j]-97]=l-j-1;
- j++;
- }
- }
- int Delta2(char *str, int *delta2)
- {
- int i=0, l=strlen(str), t;
- int temp[l];
- Suffix(str, temp);
- t=temp[0];
- while (i<l){
- while (t<i)
- t=temp[t+1];
- delta2[i] =t+l-i;
- i++;
- }
- i=0;
- while (i<(l-1)){
- t=i;
- while (t<l){
- t=delta2[t+1];
- if (temp[i]!=temp[t])
- delta2[t]=l-(i + 1);
- }
- i++;
- }
- }
- int Max(int a, int b)
- {
- return (a>b) ? a : b;
- }
- void BM(char *str1, char *str2, int *arr, int *delta2)
- {
- Delta1(str1, arr);
- Delta2(str1, delta2);
- int s, t, i;
- s=strlen(str1)-1;
- t=strlen(str2);
- while(s<t){
- i=s-1;
- while(str2[s]==str1[i]){
- if (i==0){
- printf("%d ", s);
- break;
- }
- i--;
- s--;
- }
- int p=str2[s];
- s+= Max(arr[p], delta2[i]);
- s=t;
- }
- }
- int main(int argc, char **argv)
- {
- int *suffix = malloc(sizeof(int)*strlen(argv[1]));
- int *delta2 = malloc(sizeof(int)*strlen(argv[1]));
- int *arr=malloc(sizeof(int)*128);
- BM(argv[1], argv[2], arr, delta2);
- free(suffix);
- free(delta2);
- free(arr);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement