sebenarnya cukup tegang dengan soal ini :D
but it's not a reason.
Ok, langsung saja
Ingat :
Pada semua kasus, total banyak karakter pada N buah string (tidak termasuk s) yang ada pada masukan tidak melebihi 200 000. Selain itu, masing-masing dari N buah string itu panjangnya tidak melebihi panjang s.
- Subtask 1 (30 poin): panjang s melebihi nol tapi tidak melebihi 1000. 1 <= N <= 1000.
- Subtask 2 (70 poin): panjang s melebihi nol tapi tidak melebihi 100 000. 1 <= N <= 100 000.
Format Masukan
Baris pertama masukan berisi sebuah string s sesuai pada deskripsi soal. Kemudian, baris kedua berisi sebuah bilangan bulat N. Pada N baris berikutnya, masing-masing berisi sebuah string a[i].Format Keluaran
Sebuah baris berisi sebuah bilangan bulat yang merupakan banyaknya string dari N buah string yang merupakan subsequence dari s.apa itu subsequence???
subsequence itu maksudnya apakah string tersebut merupakan bagian dari string sebelumnya
misalnya
string S=asbcdefghijklmnopqrstuvw
string A=defghij
string B=mno
string C=ghj
string D=klmo
maka A dan B termasuk subsequence dari S sedangkan C dan D tidak.
Bagaimana mendapatkan 200000 karakter sedangkan string hanya memuat 255 karakter???
Bisa,,, gunakan array of char.
Mulai Pembahasan :
Pertama siapkan sebuah kode algoritma untuk menginput karakter yang sampai sepanjang 200000 karakter itu spt ini. while not(EOLN) do begin inc(i); read(x[i]); end;silahkan diperhatikan !
EOLN adalah sebuah fungsi yang membaca data hingga akhir baris/hingga ditemukan baris baru.
Siapkan juga pembaca subsequence yang diminta seperti ini
while (j<=N) do begin.......
while not(EOLN) do begin inc(k); read(y[k]); end;.......end; silahkan diperhatikan. ! (N adalah banyak subsequence yang akan diperiksa)
Selanjut nya buat sebuah fungsi yang memeriksa apakah subsequence ada pada string yang ditentukan spt. ini
function cek(S:char;h:integer):boolean;var g,b : integer; salah : boolean;begin for g:=1 to i-1 do begin if S=x[g] then begin salah:=false; for b:=g to (g+h) do begin if not(y[b-g+1]=x[b]) then salah:=true; end; if not(salah) then begin cek:=true; break; end; end; end; if salah then cek:=false;end;dimana pada fungsi tsb. h adalah panjang subsequence (mis pada contoh subsequence diatas panjang A=7, B=3, dst) dan S pada fungsi tsb adalah karakter pertama dari subsequence tadi (mis pada contoh subsequence diatas karakter pertama A=d, B=m)
dari pembahasan singkat diatas didapat jawaban spt. berikut ini :
var x,y : array[1..200000] of char; c,i,j,k,N : integer;function cek(S:char;h:integer):boolean;var g,b : integer; salah : boolean;begin for g:=1 to i-1 do begin if S=x[g] then begin salah:=false; for b:=g to (g+h) do begin if not(y[b-g+1]=x[b]) then salah:=true; end; if not(salah) then begin cek:=true; break; end; end; end; if salah then cek:=false;end;beginc:=0;i:=0;j:=1; while not(EOLN) do begin inc(i); read(x[i]); end;readln(N);while (j<=N) do begin k:=0; while not(EOLN) do begin inc(k); read(y[k]); end; if cek(y[1],k-1) then inc(c); readln; inc(j);end;writeln(c);end.
Tidak ada komentar:
Posting Komentar