using System.Collections.Generic;
using System.Text.RegularExpressions;
public static void Main()
var lines_list = new List<string>();
var wordsArr = new string[]{"alpha", "beta", "gama", "delta", "Epsilon", "Zeta", "Eta", "Theta", "Iota", "kaPPa", "LamBda", "mU", "Nu", "xi", "omicron", "pi", "rHo", "siGma", "Tau", "UpSiLoN", "pHi", "chi", "psi", "omega"};
var ss = new StringBuilder();
var rnd = new Random( 12345 );
for ( int i = 0; i < 50000; i++ )
var words_arr = new List<string>();
for ( int j = 0; j < rnd.Next(10,20); j++)
words_arr.Add( wordsArr[ rnd.Next( wordsArr.Length ) ] );
var tab_count = rnd.Next( 0, 5 );
var line = new StringBuilder();
for ( int k = 0; k < tab_count; k++ ) line.Append("\t");
foreach( var w in words_arr )
var result = line + "\n";
lines_list.Add( result );
var sw = new System.Diagnostics.Stopwatch();
var dp = new DocProcessor();
dp.ProcessDocument( str );
Console.WriteLine( dp.kappa.Length + dp.omicron.Length + dp.upsilon.Length );
Console.WriteLine("Time:" + sw.ElapsedMilliseconds + " ms.");
public class DocProcessor
List<int> _kappa = new List<int>();
List<string> _omicron = new List<string>();
List<string> _upsilon = new List<string>();
public string[] omicron {
return _omicron.ToArray();
public string[] upsilon {
return _upsilon.ToArray();
public void ProcessDocument( string doc )
var spaces = new char[]{' ',' '};
var reOmicron = new Regex( "^omicron\\b", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.Compiled );
var reKappa = new Regex( "^kappa\\b", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.Compiled );
var reUpsilon = new Regex( "^upsilon\\b", RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.Compiled );
using (System.IO.StringReader sr = new System.IO.StringReader(doc))
while ((line = sr.ReadLine()) != null)
var lline = line.TrimStart( spaces );
if ( reOmicron.IsMatch( lline ) )
if ( reKappa.IsMatch( lline ) )
if ( reUpsilon.IsMatch( lline ) )