namespace csavarkeszlet { class Program { static void Main(string[] args) { StreamReader sr = new StreamReader(args[0]); String line; while ((line = sr.ReadLine()) != null) { String[] tokens = line.Split(' '); int sor = int.Parse(tokens[0]); int oszlop = int.Parse(tokens[1]); int anya = 0; String[] t = new String[sor]; int[] szamok = new int[100000]; for (int i = 0; i < sor; i++) { t[i] = sr.ReadLine(); } for (int i = 0; i < sor; i++) { for (int j = 0; j < oszlop; j++) { if ((t[i][j]) == 'O') { anya++; String temp = t[i].Substring(0, j) + '.' + t[i].Substring(j + 1); t[i] = temp; } if ((t[i][j]) == '*') { String temp = t[i].Substring(0, j) + '.' + t[i].Substring(j + 1); t[i] = temp; int k = i; int l = j; int hossz = 0; //bal while (l > 0 && t[k][l - 1] == '-') { l--; hossz++; String tmp = t[k].Substring(0, l) + '.' + t[k].Substring(l + 1); t[k] = tmp; if (hossz > 0 && (l == 0 || t[k][l - 1] != '-')) { szamok[hossz]++; //System.out.println("bal:"+hossz); hossz = 0; k = i; l = j; break; } } //jobb while (l < oszlop - 1 && t[k][l + 1] == '-') { l++; hossz++; String tmp = t[k].Substring(0, l) + '.' + t[k].Substring(l + 1); t[k] = tmp; if (hossz > 0 && (l == oszlop - 1 || t[k][l + 1] != '-')) { szamok[hossz]++; //System.out.println("jobb:"+hossz); hossz = 0; k = i; l = j; break; } } //fel while (k > 0 && t[k - 1][l] == '|') { k--; hossz++; String tmp = t[k].Substring(0, l) + '.' + t[k].Substring(l + 1); t[k] = tmp; if (hossz > 0 && (k == 0 || t[k - 1][l] != '|')) { szamok[hossz]++; //System.out.println("fel:"+hossz); hossz = 0; k = i; l = j; break; } } //le while (k < sor - 1 && t[k + 1][l] == '|') { k++; hossz++; String tmp = t[k].Substring(0, l) + '.' + t[k].Substring(l + 1); t[k] = tmp; if (hossz > 0 && (k == sor - 1 || t[k + 1][l] != '|')) { szamok[hossz]++; //System.out.println("le:"+hossz); hossz = 0; k = i; l = j; break; } } //bal fel atlo while ((l > 0 && k > 0) && t[k - 1][l - 1] == '\\') { l--; k--; hossz++; String tmp = t[k].Substring(0, l) + '.' + t[k].Substring(l + 1); t[k] = tmp; if (hossz > 0 && (l == 0 || k == 0 || t[k - 1][l - 1] != '\\')) { szamok[hossz]++; //System.out.println("balfel:"+hossz); hossz = 0; k = i; l = j; break; } } //bal le atlo while ((l > 0 && k < sor - 1) && t[k + 1][l - 1] == '/') { l--; k++; hossz++; String tmp = t[k].Substring(0, l) + '.' + t[k].Substring(l + 1); t[k] = tmp; if (hossz > 0 && (l == 0 || k == sor - 1 || t[k + 1][l - 1] != '/')) { szamok[hossz]++; //System.out.println("balle:"+hossz); hossz = 0; k = i; l = j; break; } } //jobb fel atlo while ((l < oszlop - 1 && k > 0) && t[k - 1][l + 1] == '/') { l++; k--; hossz++; String tmp = t[k].Substring(0, l) + '.' + t[k].Substring(l + 1); t[k] = tmp; if (hossz > 0 && ((l == oszlop - 1 || k == 0) || t[k - 1][l + 1] != '/')) { szamok[hossz]++; //System.out.println("jobbfel:"+hossz); hossz = 0; k = i; l = j; break; } } //jobb le atlo while ((l < oszlop - 1 && k < sor - 1) && t[k + 1][l + 1] == '\\') { l++; k++; hossz++; String tmp = t[k].Substring(0, l) + '.' + t[k].Substring(l + 1); t[k] = tmp; if (hossz > 0 && ((l == oszlop - 1 || k == sor - 1) || t[k + 1][l + 1] != '\\')) { szamok[hossz]++; //System.out.println("jobble:"+hossz); hossz = 0; k = i; l = j; break; } } } } } Console.Write(anya); for (int i = 0; i < szamok.Length; i++) if (szamok[i] > 0) Console.Write(" " + i + ":" + szamok[i]); Console.WriteLine(""); } } } }