結果
問題 | No.430 文字列検索 |
ユーザー | 明智重蔵 |
提出日時 | 2023-01-28 18:07:57 |
言語 | C#(csc) (csc 3.9.0) |
結果 |
AC
|
実行時間 | 300 ms / 2,000 ms |
コード長 | 4,228 bytes |
コンパイル時間 | 1,876 ms |
コンパイル使用メモリ | 108,416 KB |
実行使用メモリ | 52,792 KB |
最終ジャッジ日時 | 2024-11-10 01:05:10 |
合計ジャッジ時間 | 4,524 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 33 ms
18,944 KB |
testcase_01 | AC | 300 ms
52,792 KB |
testcase_02 | AC | 215 ms
22,656 KB |
testcase_03 | AC | 213 ms
22,528 KB |
testcase_04 | AC | 31 ms
18,816 KB |
testcase_05 | AC | 32 ms
18,688 KB |
testcase_06 | AC | 31 ms
18,816 KB |
testcase_07 | AC | 31 ms
18,688 KB |
testcase_08 | AC | 278 ms
50,528 KB |
testcase_09 | AC | 33 ms
19,200 KB |
testcase_10 | AC | 52 ms
22,656 KB |
testcase_11 | AC | 229 ms
27,136 KB |
testcase_12 | AC | 227 ms
27,520 KB |
testcase_13 | AC | 228 ms
27,264 KB |
testcase_14 | AC | 226 ms
25,216 KB |
testcase_15 | AC | 223 ms
24,832 KB |
testcase_16 | AC | 220 ms
22,528 KB |
testcase_17 | AC | 215 ms
22,656 KB |
コンパイルメッセージ
Microsoft (R) Visual C# Compiler version 3.9.0-6.21124.20 (db94f4cc) Copyright (C) Microsoft Corporation. All rights reserved.
ソースコード
using System; using System.Collections.Generic; using System.Linq; // https://yukicoder.me/problems/no/430 class Program { static string InputPattern = "InputX"; static List<string> GetInputList() { var WillReturn = new List<string>(); if (InputPattern == "Input1") { WillReturn.Add("ABCDABCD"); WillReturn.Add("3"); WillReturn.Add("A"); WillReturn.Add("DA"); WillReturn.Add("ABCDABCD"); //4 } else if (InputPattern == "Input2") { WillReturn.Add("YUKICODER"); WillReturn.Add("2"); WillReturn.Add("X"); WillReturn.Add("ABCDEFGHIJ"); //0 } else if (InputPattern == "Input3") { WillReturn.Add("AAAA"); WillReturn.Add("4"); WillReturn.Add("A"); WillReturn.Add("AA"); WillReturn.Add("AAA"); WillReturn.Add("AAAA"); //10 } else if (InputPattern == "Input4") { WillReturn.Add("ABAACABCAACBABABACBBAC"); WillReturn.Add("7"); WillReturn.Add("A"); WillReturn.Add("C"); WillReturn.Add("AA"); WillReturn.Add("ABB"); WillReturn.Add("ABA"); WillReturn.Add("BA"); WillReturn.Add("CBBAC"); //26 } else { string wkStr; while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr); } return WillReturn; } static void Main() { List<string> InputList = GetInputList(); string S = InputList[0]; var InsRollingHash = new RollingHash(S); int UB = S.Length - 1; // 件数[ハッシュ値]なDict var CntDict = new Dictionary<decimal, long>(); for (int LoopRange = 1; LoopRange <= 10; LoopRange++) { for (int RangeSta = 0; RangeSta <= UB; RangeSta++) { int RangeEnd = RangeSta + LoopRange - 1; if (RangeEnd > UB) break; decimal Hash = InsRollingHash.GetRangeHash(RangeSta, RangeEnd); if (CntDict.ContainsKey(Hash) == false) { CntDict[Hash] = 0; } CntDict[Hash]++; } } long Answer = 0; foreach (string EachStr in InputList.Skip(2)) { var CurrRollingHash = new RollingHash(EachStr); int RangeSta = 0; int RangeEnd = EachStr.Length-1; decimal CurrHash = CurrRollingHash.GetRangeHash(RangeSta, RangeEnd); if (CntDict.ContainsKey(CurrHash)) { Answer += CntDict[CurrHash]; } } Console.WriteLine(Answer); } } #region RollingHash // ローリングハッシュ internal class RollingHash { const decimal Base = 100; const decimal Hou = 67280421310721; // ハッシュ値[終了Ind]で、[0,終了Ind]のハッシュ値を保持 decimal[] mHashArr; // 桁の重みの配列 decimal[] mOmomiArr; // コンストラクタ internal RollingHash(string pTargetStr) { decimal Omomi = 1; long UB = pTargetStr.Length - 1; mHashArr = new decimal[UB + 1]; mOmomiArr = new decimal[UB + 1]; for (int I = 0; I <= UB; I++) { mOmomiArr[I] = Omomi; if (I > 0) { mHashArr[I] += mHashArr[I - 1] * Base; mHashArr[I] %= Hou; } mHashArr[I] += pTargetStr[I]; mHashArr[I] %= Hou; Omomi *= Base; Omomi %= Hou; } } // [Sta,End]のハッシュ値を返す internal decimal GetRangeHash(long pSta, long pEnd) { decimal WillReturn = mHashArr[pEnd]; if (pSta > 0) { long Range = pEnd - pSta + 1; decimal PrevVal = mHashArr[pSta - 1]; decimal MinusVal = PrevVal * mOmomiArr[Range]; MinusVal %= Hou; WillReturn -= MinusVal; if (WillReturn < 0) { WillReturn += Hou; } } return WillReturn; } } #endregion