LTPMSEQ spoj – Tìm xâu

Nguồn đề bài: http://vn.spoj.com/problems/LTPMSEQ/

1. Đề bài LTPMSEQ spoj

Sau khi đã giải được PTQMSEQ, PM bắt leaxtanh vượt qua thử thách thứ 2 là chứng tỏ tình cảm của mình. Leaxtanh viết ra trên giấy n xâu với những dòng chữ tình cảm.

Sau khi viết xong, với con mắt tinh đời, PM hỏi leaxtanh : có duy nhất 1 xâu xuất hiện lẻ lần. Nếu tìm được thì sẽ đi chơi.

Bạn hãy giúp leaxtanh nhé. 😀

Input

Dòng đầu tiên chứa số n( n<=10^5)

N dòng sau là các xâu st ( length(st) <=15);

Output

1 dòng duy nhất chứa xâu cần tìm.

Nếu không tìm được in ra -1;
Input:
9
Mai
Yeu
Lam
Son
Toi
Toi
Lam
Son
Yeu

Output:
Mai

2. Hướng dẫn LTPMSEQ spoj

Bài này dùng Bitmask bằng phép tính xor. tất nhiên không thể xor chuỗi vs chuỗi rồi 😀 nên bạn sẽ xor theo mã ASCII của nó.

ở đây tân dụng tính chất a xor a = 0 và 0 xor a = a. 1 chữ cái xuất hiện chẵn lần thì khi xor hết lại sẽ được 0, xuất hiện lẻ lần thì sẽ được chính nó. tạo 1 mảng s[15], mỗi khi đọc 1 xâu st, gán lại s[i] = s[i] xor st[i]. khi đọc đủ n xâu thì mảng s còn lại chính là kq.

Ngoài ra bài này còn có thể duyệt, dùng Hash + xor, sort,… cũng làm dc…

3. code tham khảo LTPMSEQ spoj

var
	n, i, j: longint;
	s: array [1..15] of longint;
	st: string;
begin
	readln(n);
	fillchar(s,sizeof(s),0);
	for i := 1 to n do
	begin
		readln(st);
		for j := 1 to length(st) do
			s[j] := s[j] xor ord(st[j]);
	end;

	for i := 1 to 15 do
	begin
		if (s[i] = 0) then exit;
		write(chr(s[i]));
	end;
end.

=================

code tham khảo cho ý tưởng khác (duyệt):

const   fi='';
var
        f:text;
        A:array[1..100000] of string[16];
        b:array[1..100000] of byte;
        n,dem:longint;
        i:longint;
        tam:string;

procedure tim;
var     i:longint;
begin
        for i:=1 to dem do
                if tam = a[i] then
                        begin
                                b[i]:=2;
                                exit;
                        end;
        inc(dem);
        a[dem]:=tam;
        b[dem]:=1;

end;

begin
        assign(f,fi); reset(f);
        readln(f,n);
        readln(f,a[1]);
        b[1]:=1;
        dem:=1;
        for i:=2 to n do
                begin
                        readln(f,tam);
                        tim;
                end;
        close(f);

        for i:=1 to dem do
                if b[i]=1 then
                        begin
                                writeln(a[i]);
                                exit;
                        end;
        writeln(-1);
end.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *