題意略。
這道題讓我一度有了撞牆的衝動。。。。。。
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.模擬類題型。將輸...