Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- program cub;
- {$APPTYPE CONSOLE}
- uses
- SysUtils,
- Generics.Collections;
- var
- matching1, matching2: TDictionary<integer, integer>;
- edges : TList<TList<integer>>;
- vis : TList<boolean>;
- ans : TList<integer>;
- n, i, j, k: integer;
- word : string;
- letters : TList<char>;
- cycle, b : boolean;
- function kuhn(vertex: integer): boolean;
- var
- u: integer;
- begin
- for u in edges.Items[vertex] do
- begin
- if (vis.Items[u]) then
- Continue;
- if (not matching1.ContainsKey(u)) then
- begin
- matching1.AddOrSetValue(u, vertex);
- matching2.AddOrSetValue(vertex, u);
- exit(true);
- end else begin
- vis.Items[u] := true;
- if (kuhn(matching1.Items[u])) then
- begin
- matching1.AddOrSetValue(u, vertex);
- matching2.AddOrSetValue(vertex, u);
- vis.Items[u] := false;
- exit(true);
- end;
- vis.Items[u] := false;
- end;
- end;
- result := false;
- end;
- begin
- edges := TList < TList < integer >>.Create;
- matching1 := TDictionary<integer, integer>.Create;
- matching2 := TDictionary<integer, integer>.Create;
- vis := TList<boolean>.Create;
- letters := TList<char>.Create;
- reset(input, 'input.txt');
- rewrite(output, 'output.txt');
- readln(n);
- readln(word);
- for i := 1 to length(word) do
- letters.Add(word[i]);
- for i := 1 to n do
- vis.Add(false);
- for i := 1 to letters.Count do
- edges.Add(TList<integer>.Create);
- for i := 0 to n - 1 do
- begin
- readln(word);
- for j := 1 to length(word) do
- for k := 0 to letters.Count - 1 do
- if ((word[j] = letters.Items[k]) and (not edges.Items[k].Contains(i))) then
- edges.Items[k].Add(i);
- end;
- cycle := true;
- while (cycle) do
- begin
- cycle := false;
- for i := 0 to letters.Count - 1 do
- cycle := kuhn(i) or cycle;
- cycle := cycle and (matching2.Count < letters.Count);
- end;
- ans := TList<integer>.Create(matching2.Keys);
- ans.Sort;
- for i in ans do
- write(Format('%d ', [matching2.Items[i] + 1]));
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement