AtCoderのABC
   次のABCの問題へ
   前のABCの問題へ
ABC386-C Operate 1
C#のソース
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
    static string InputPattern = "InputX";
    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();
        if (InputPattern == "Input1") {
            WillReturn.Add("1");
            WillReturn.Add("abc");
            WillReturn.Add("agc");
            //Yes
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("1");
            WillReturn.Add("abc");
            WillReturn.Add("awtf");
            //No
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("1");
            WillReturn.Add("abc");
            WillReturn.Add("ac");
            //Yes
        }
        else if (InputPattern == "Input4") {
            WillReturn.Add("1");
            WillReturn.Add("back");
            WillReturn.Add("black");
            //Yes
        }
        else if (InputPattern == "Input5") {
            WillReturn.Add("1");
            WillReturn.Add("same");
            WillReturn.Add("same");
            //Yes
        }
        else if (InputPattern == "Input6") {
            WillReturn.Add("1");
            WillReturn.Add("leap");
            WillReturn.Add("read");
            //No
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }
    static string mS;
    static string mT;
    static void Main()
    {
        List<string> InputList = GetInputList();
        mS = InputList[1];
        mT = InputList[2];
        if (mS == mT) {
            Console.WriteLine("Yes");
            return;
        }
        if (IsOK3()) {
            Console.WriteLine("Yes");
            return;
        }
        if (IsOK12()) {
            Console.WriteLine("Yes");
            return;
        }
        Console.WriteLine("No");
    }
    static bool IsOK12()
    {
        if (Math.Abs(mS.Length - mT.Length) > 1) {
            return false;
        }
        var InsLinkedList1 = new LinkedList<char>();
        var InsLinkedList2 = new LinkedList<char>();
        foreach (char EachChar in mS) InsLinkedList1.AddFirst(EachChar);
        foreach (char EachChar in mT) InsLinkedList2.AddFirst(EachChar);
        while (InsLinkedList1.Count > 0 && InsLinkedList2.Count > 0) {
            char FisrtChar1 = InsLinkedList1.First.Value;
            char FisrtChar2 = InsLinkedList2.First.Value;
            if (FisrtChar1 == FisrtChar2) {
                InsLinkedList1.RemoveFirst();
                InsLinkedList2.RemoveFirst();
                continue;
            }
            break;
        }
        while (InsLinkedList1.Count > 0 && InsLinkedList2.Count > 0) {
            char LastChar1 = InsLinkedList1.Last.Value;
            char LastChar2 = InsLinkedList2.Last.Value;
            if (LastChar1 == LastChar2) {
                InsLinkedList1.RemoveLast();
                InsLinkedList2.RemoveLast();
                continue;
            }
            break;
        }
        int Cnt = InsLinkedList1.Count + InsLinkedList2.Count;
        return Cnt <= 1;
    }
    static bool IsOK3()
    {
        if (mS.Length != mT.Length) return false;
        int UnMatchCnt = 0;
        for (int I = 0; I <= mS.Length - 1; I++) {
            if (mS[I] != mT[I]) {
                UnMatchCnt++;
            }
        }
        return UnMatchCnt <= 1;
    }
}
解説
LinkedListで
前から削る処理をシュミレーションしてから
後から削る処理をシュミレーションしてます。