Выполнение программы зависит от размера I / P, превышающего 5 в C - PullRequest
0 голосов
/ 18 декабря 2011

Это вопрос.

Для двух строк A и B мы определяем сходство строк как длину самого длинного префикса, общего для обеих строк.Например, сходство строк «abc» и «abd» равно 2, а сходство строк «aaa» и «aaab» - 3. Вычислить сумму сходств строки S с каждым из ее суффиксов.

Входные данные: Первая строка содержит количество тестовых примеров T. Каждая из следующих T строк содержит по каждой строке.

Выходные данные: Выходные T строксодержит ответ для соответствующего теста.

Ограничения: 1 <= T <= 10 Длина каждой строки не более 100000 и содержит только символы нижнего регистра. </p>

Пример ввода: 2 ababaa aa

Пример ввода: 11 3

Объяснение: Для первого случая:суффиксами строки являются «ababaa», «babaa», «abaa», «baa», «aa» и «a».Сходство каждой из этих строк со строкой «ababaa» составляет 6,0,3,0,1,1 соответственно.Таким образом, ответ: 6 + 0 + 3 + 0 + 1 + 1 = 11.

Проблема, с которой я сталкиваюсь: Она работает правильно для тестовых случаев меньше 5. Для 5и после 5 вывод для первой строки печатается как 0. Для отладки я использовал символьную переменную k, чтобы найти значение, на которое указывают указатели.k имел значения -54, -56 и другие значения при расчете для первой строки.Он работает правильно для других строк, кроме первой.

Я даже попытался напечатать первую строку.Некоторое мусорное значение печатается.Но он печатает правильно для тестовых случаев <5. Я дал код ниже.Пожалуйста, помогите мне. </p>

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    int test_cases,i,j,*count;
    char k; //for testing purpose to determine the character at each iteration
    scanf("%d",&test_cases);
    count = calloc(test_cases,sizeof(int));
    char **strings, *initial_ptr, *current_ptr, *start_ptr;
    strings =  malloc(test_cases);
    for(i=0;i<test_cases;i++)
    {
       strings[i] =  malloc(100000);
       scanf("%s",strings[i]);
    }
    initial_ptr = start_ptr = *strings;
    current_ptr = *strings;

    //testing
    printf("This is the first string: ");
    puts(strings[0]);



    int temp_count=0;
    for(i=0;i<test_cases;i++)
    {
       current_ptr = initial_ptr = start_ptr = *(strings+i);
       temp_count=0;
       for(j=0;j<strlen(strings[i]);j++)
       {
         k = *current_ptr;
         while((*current_ptr) && (*current_ptr >= 'a') && (*current_ptr <= 'z'))
         {
           if(*current_ptr == *initial_ptr)
           {

             temp_count++;
             current_ptr++;
             initial_ptr++;
           }
           else
           {
             start_ptr++;
             current_ptr = start_ptr ;
             initial_ptr = *(strings+i) ;
           }
         }
         current_ptr = start_ptr;
         count[i]=temp_count;

       }
    }
    for(i=0;i<test_cases;i++)
    {
     printf("\n%d",count[i]);
    }
    return 0;

}

1 Ответ

2 голосов
/ 18 декабря 2011
count = (int *)calloc(test_cases*sizeof(int),0);

не имеет смысла.Второй параметр в calloc - это размер элементов, которые вы выделяете.Этот вызов должен читаться следующим образом:

count = calloc(test_cases, sizeof(int));

Это тоже неправильно:

strings = (char **) malloc(test_cases);

должно быть:

strings = malloc(test_cases*sizeof(char*));

Это:

printf("This is the first string: ");
puts(strings[1]);

вводит в заблуждение: печатает строку second .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...