На самом деле это одна из проблем, связанных с хакерством. Вот ссылка на проблему: https://www.hackerrank.com/challenges/antipalindromic-stringsAntiPalindromic Strings
Я как-то понял способ найти ответ. Но проблема в том, что мой код не принимается из-за тайм-аута. Пожалуйста, помогите мне, какая часть делает мой код медленнее.
Это мой код:
int anti_palindrome(long int n,long int m,int mod)
{
int prod;
prod=m;
if(n>1)
prod=prod*(m-1);
if(n>2)
{
n=n-2;
while(n)
{
prod=prod*(m-2);
n--;
}
}
return prod%mod;
}
int main()
{
char scanned[1000];
int input = 0;
int T=0;
int T_cur=0;
long int N,M;
char str[1000];
int mod=1000000007;
while(fgets(scanned,1000,stdin))
{
switch(input)
{
case 0: {
T=atoi(scanned);
input=1;
}
break;
case 1: {
T_cur++;
strcpy(str,scanned);
sscanf(str,"%d %d",&N,&M);
//printf("%lf %lf\n",N,M);
printf("%d\n",anti_palindrome(N,M,mod));
}
break;
}
if(T_cur==T)
break;
}
return 0;
}
Любой один прогон программы, возможно, придется обрабатывать до 10 N
, M
пар, с N
и M
каждого между 1 и 10 .
У меня возникли проблемы с пониманием того, почему работает этот алгоритм. Рассмотрим N = 4 и M = 4. Скажем, символы в нашем наборе - это A, B, C и D. В основном вы выбираете первый символ в 4-х направлениях, второй символ тремя способами, а все остальные символы выбираются из остального двух символов (с возможными повторами). Таким образом, это не должно вычитать случай «ABCC» или «ABDD», например, который явно содержит палиндромные подстроки размером> 1. Не могли бы вы рассказать мне, почему работает этот алгоритм? – Venkat