private RopeString(RopeString left, RopeString right) { _leftChild = left; _rightChild = right; _isLeaf = false; _length = GetLength(left) + GetLength(right); }
/// <summary>Вставляет переданную строку в нужную позицию</summary> public RopeString Insert(int position, RopeString rope) { RopeString left, right; this.Split(position, out left, out right); return(left + rope + right); }
/// <summary>Разбивает строку на две части </summary> private void Split(int leftLength, out RopeString left, out RopeString right) { leftLength = Math.Min(leftLength, this.Length); // Тривиальные случаи if (leftLength == 0) { left = new RopeString(); right = this; } else if (leftLength >= Length) { left = this; right = new RopeString(); } else { if (_isLeaf) // Базовый случай - лист { left = new RopeString(this.Value); left._length = leftLength; right = new RopeString(this.Value); right._offset = leftLength; right._length = this.Length - leftLength; } else { // Определяем, в каком сыне находится граница разбиения if (leftLength <= GetLength(_leftChild)) { RopeString leftLeft, leftRight; _leftChild.Split(leftLength, out leftLeft, out leftRight); left = leftLeft; right = leftRight + _rightChild; } else { RopeString rightLeft, rightRight; _rightChild.Split(leftLength - GetLength(_leftChild), out rightLeft, out rightRight); left = _leftChild + rightLeft; right = rightRight; } } } }
static void Main(string[] args) { string initialString = Console.ReadLine(); RopeString rope = new RopeString(initialString); int linesCnt = int.Parse(Console.ReadLine()); for (int i = 0; i < linesCnt; i++) { string[] tmp = Console.ReadLine().Split(sep); int from = int.Parse(tmp[0]); int to = int.Parse(tmp[1]); int pos = int.Parse(tmp[2]); RopeString fragment = rope.Substring(from, to - from + 1); RopeString cuttedStr = rope.Erase(from, to - from + 1); if (pos == 0) { rope = fragment + cuttedStr; } else if (pos == cuttedStr.Length) { rope = cuttedStr + fragment; } else { // вставить после k-го символа оставшейся строки // оставшаяся строка = cuttedStr rope = cuttedStr.Insert(pos, fragment); } //Console.WriteLine(rope.Value); } Console.WriteLine(rope.Value); //Console.ReadLine(); }
// Вспомогательная функция для получения длины, избавляющая от проверки на null private static int GetLength(RopeString rope) { return(rope == null ? 0 : rope.Length); }
// Вспомогательная функция для получения результата, избавляющая от проверки на null private static string GetValue(RopeString rope) { return(rope == null ? "" : rope.Value); }