Это вопрос.
Для двух строк 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;
}