12.06.2016, 16:01
|
#1 (permalink)
|
Member
Регистрация: 12.01.2015
Сообщений: 71
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Ускорение программы работающей со строками
Подскажите, как быстрее сделать? Какие вообще есть быстрые способы решения? Моё решение выходить за границу времени.
Слова
(Время: 1 сек. Память: 16 Мб Сложность: 48%)
Для шифрования слов с ними можно производить множество различных операций. Например, интересна такая операция: первые несколько букв заданного слова приписываются к его концу в обратном порядке, после чего удаляются из начала слова. При этом слово a1a2 … akak+1 … an переходит в слово ak+1 … anakak-1 … a1 (число k выбирается в диапазоне от 0 до n).
Для двух заданных слов требуется определить, можно ли применением описанной операции преобразовать первое слово во второе.
Входные данные
Входной файл INPUT.TXT состоит из двух строк - на первой из них записано исходное слово, а во второй - предполагаемый результат. Длины строк не превышают 50000 символов.
Выходные данные
В первой строке выходного файла OUTPUT.TXT выведите "Yes", если преобразование возможно, и "No", если нет. В случае положительного ответа во второй строке выведите k - длину перемещаемой части исходного слова k (из всех таких k выберите минимальный).
Моё решение:
Код:
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int main(){
string Str2 = "";
int i = 0, p=0;
string Strok1 , Strok2; // <50000
cin >> Strok1 >> Strok2;
if (Strok1 == Strok2)
{
cout << "Yes" << endl << 0;
return 0;
}
int rs = Strok1.size();
for (i = 1; i <= rs/2; i++)
{
Str2 = Strok1[i - 1] + Str2;
if (Strok1[i - 1] != Strok2[rs - i])
{
cout << "No";
return 0;
}
if (Strok1.substr(i, rs - i)+Str2 == Strok2)
{
cout << "Yes" << endl << i;
return 0;
}
}
cout << "No";
return 0;
}
|
|
|