解題報告 tyvj 1068

2022-06-04 02:18:12 字數 1701 閱讀 7840

題意略。

這道題讓我一度有了撞牆的衝動。。。。。。

y 的乙個水水更健康的擴充套件 kmp , wa 了四次。。。。。

額,大概是這麼做:

首先,kmp 是神馬,不會的自覺去看 matrix67 blog。

然後,我們可以發現,主程式的時候,通常輸出匹配位置時,是在:

while (j>0) and (b[j+1]<>a[i]) do j:=p[j];

if b[j+1]=a[i] then inc(j);

if j=m thenprint;

這意味著什麼?bingo,這個 j 就是當前兩個字串所匹配的字元數---------------說白了,就是這個題的答案。。。。

額,不過有一點要注意,就是,如果在 m 位置可以匹配 j 個字元,那麼顯然在 m 位置也可以匹配 p[j] 個字元,所以要計算一下累和。關於這一點,題解上說的是「根據kmp自我匹配陣列的性質,如果以a串某個元素結尾有乙個長度為11的字串可以與b串匹配的話,以該元素結尾的長度為kmp[11] = 4的字串也是可以匹配的。所以說cnt[4] += cnt[11]。」但是呢,本蒟蒻沒有看懂。。。。。於是本蒟蒻發現這個用的方法很簡單,拍資料!!!!

其實,好多好神奇的規律,在考場一般也只能觀察出來,tat。。。。。所以,數學帝是非常值得膜拜的。。。。

** suemiller:

program acrush;

var a,b:ansistring;

n,m,kk,i,j,k:longint;

p,q:array[0..200001]of longint;

procedure gp;

var j:longint;

begin

p[1]:=0;

j:=0;

for i:=2 to m do

begin

while (j>0) and (b[j+1]<>b[i]) do j:=p[j];

if b[j+1]=b[i] then inc(j);

p[i]:=j;

end;

end;

begin

readln(n,m,kk);

readln(a);

readln(b);

gp;j:=0;

for i:=1 to n do

begin

while (j>0) and (b[j+1]<>a[i]) do j:=p[j];      //

if b[j+1]=a[i] then inc(j);                             //這一行和上一行,全寫的是 b[i]  b[j+1]  。。。。。貢獻 2 wa 。

inc(q[j]);

if j=m then j:=p[j];

end;

for i:=m downto 1 do

inc(q[p[i]],q[i]);          //沒觀察到這個規律,1 wa 。

for i:=1 to kk do

begin

readln(k);

writeln(q[k]-q[k+1]);   //沒觀察到這個規律,1 wa 。------>根據我們的計算方法可以得出,當乙個字元及其之前的字元一共可以匹配 k+1 次時,那麼他一定也能匹配 k 次。。。。。偶們求的是累和嘛。。。。

end;

end.

TYVJ 1087 sumsets 解題報告

這個題目有點價值吧,設f i 為i的不同組合有多少種,那麼i就可以表示成 i 1 1,也就是i 1有多少種排列i就有多少種,但是比如i 6的時候,可以表示成2 2 2,4 2,這裡沒有出現1,怎麼辦呢?可以看到i為偶數的時候一定可以把i表示成2 i 2 然麼就可以得到 f i f i 1 i 為奇數...

TYVJ 1069 cowtour 解題報告

usaco原題,做過幾次了,所以一次ac,就是暴搜,因為資料小。先把每個牧區的直徑求出來,然後再把在乙個牧區中距離任意節點的最遠距離算出來,然後暴搜,若i,j之間加一條路,那麼新牧區的半徑要麼就是i所在的牧區的的直徑,要麼是j所在的牧區的直徑,要麼就是i所在的牧區中距i最遠的距離加上j所在的牧區中距...

poj1068解題報告(模擬類)

poj 1068,題目鏈結 對於給出給出的原括號串s 對應兩種數字密碼串p w s p sequence 4 5 6666 pi 表示第i 個右括號前面有多少個左括號 w sequence 1 1 1456 wi 表示第i 個右括號對應它前面的第幾個左括號 要求給出p 串,求w 1.模擬類題型。將輸...