Есть программа, которая в цикле сравнивает строки, всё в ней работает, но в итоге превышается тайм лимит на 0,001 - 0,007 секунды. Решил с каждой итерацией отсекать первый символ, для ускорения работы цикла, но как это сделать?! P.S. Длина строки может достигать 100,000 символов.
Код:
#include <fstream>
#include <cstring>
std::ofstream cout("output.txt");
std::ifstream cin("input.txt");
int main() {
char e[100002] , m[100002] , s[100002];
int l ;
cin >> e ;
cin >> m ;
cin >> s ;
l = strlen(e);
for (int i=0; i <= l ;i++) {
if (strncmp(m,e,i) != 0 || strncmp(s,e,i) != 0 ) {
if (strncmp(m,e,i) == 0 && strncmp(s,e,i) != 0 ) { cout << "Masha";
break; }
if (strncmp(m,e,i) != 0 && strncmp(s,e,i) == 0 ) { cout << "Sasha";
break; }
if (strncmp(m,e,i) != 0 && strncmp(s,e,i) != 0 ) { cout << "Draw";
break; }
break;
}
else { continue;}
}
return 0;
}
Нужно инкрементировать указатели. m указывает на начало строки, а после m++ уже на второй символ и так далее. и все время сравнивать 1 символ. То есть
for (int i=0; i < l ;i++) {
if (m[i]!= e[i] || s[i] != e[i] ) {
if (m[i]== e[i] && s[i] != e[i] ) { cout << "Masha";
break; }
if (m[i]!= e[i] && s[i] == e[i]) { cout << "Sasha";
break; }
if (m[i]!= e[i] && s[i] != e[i] ) { cout << "Draw";
break; }
break;
}
//else быть не может
}
Делай сравнение только 1 раз:
for (int i=0; i <= l ;i++)
{
int m_e_i = strncmp(m,e,i);
int s_e_i = strncmp(s,e,i);
if (m_e_i != 0 || s_e_i !=0 )
{
if (m_e_i == 0 && s_e_i !=) {}
...
...
}
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей