NOIP提高組五校聯考 string

2021-07-23 10:17:28 字數 2347 閱讀 3312

給出乙個長度為n, 由小寫英文本母組成的字串s, 求在所有由小寫英文本母組成且長度為n 且恰好有k 位與s 不同的字串中,給定字串t 按照字典序排在第幾位。

由於答案可能很大,模10^9 + 7 輸出。

列舉乙個

i ,表示當前做到第

i位,而前i−

1 位的字元都已經與目標串的前i−

1 位相同,那麼對於當前位置可以分三種情況討論。

t 為目標串,

s為判定串。

1. 當ti

>si

時,意味著目標串當前位可能包含判定串,所以分成兩條式子,分別計算當前位置相等與不相等的情況。

2. 當ti

=si 時,意味著目標串當前位最多等於判定串,而因為當等於時,後續操作能夠處理到,所以只用計算不相等是的貢獻。

3. 當ti

時,與上述情況相似,只是略有一點不同。

很簡單也很好想,但是我調了一下午。

const mo=1000000007;

var c,mi,ni,s,t:array[0..100000] of int64;

n,m,i:longint;

ans:int64;

st:ansistring;

function

max(x,y:longint):longint;

begin

if x>y then

exit(x) else

exit(y);

end;

function

ksm(x,y:longint):int64;

begin

if y=0

then

exit(1);

if y=1

then

exit(x mod mo);

if y mod

2=0then

exit(sqr(ksm(x,y div

2))mod mo)

else

exit(x*ksm(x,y-1)mod mo);

end;

begin

readln(n,m);

c[0]:=1;mi[0]:=1;

for i:=1

to n do c[i]:=(c[i-1]*i)mod mo;

for i:=1

to n do mi[i]:=(mi[i-1]*25)mod mo;

ni[n]:=ksm(c[n],mo-2);

for i:=n-1

downto

0do ni[i]:=ni[i+1]*(i+1) mod mo;

readln(st);

for i:=1

to n do t[i]:=ord(st[i])-96;

readln(st);

for i:=1

to n do s[i]:=ord(st[i])-96;

for i:=1

to n do

begin

if m=0

then

break;

if s[i]=t[i] then

begin

ans:=(ans+max(0,s[i]-1)*mi[m-1] mod mo*c[n-i] mod mo*ni[m-1] mod mo*ni[n-i-m+1] mod mo)mod mo;

end;

if s[i]>t[i] then

begin

ans:=(ans+max(0,s[i]-2)*mi[m-1] mod mo*c[n-i] mod mo*ni[m-1] mod mo*ni[n-i-m+1] mod mo)mod mo;

if n-i-m<0

then

begin

dec(m);

continue;

end;

ans:=(ans+mi[m]*c[n-i] mod mo*ni[m] mod mo*ni[n-i-m] mod mo)mod mo;

dec(m);

end;

if s[i]then

begin

if n-i-m+1

<0

then

begin

dec(m);

continue;

end;

ans:=(ans+max(0,s[i]-1)*mi[m-1] mod mo*c[n-i] mod mo*ni[m-1] mod mo*ni[n-i-m+1] mod mo)mod mo;

dec(m);

end;

end;

writeln(ans+1);

end.

NOIP2016提高A組五校聯考1 道路規劃

我們考慮,當現在有乙個合法的集合時,如何往裡面增加乙個點,使這個集合仍然合法。假設現在有乙個合法的集合,那麼當我們加入乙個點,它的道路穿過來整個集合,那麼 然後搞一遍最長下降子串行就可以了。include include include include include const int maxlo...

NOIP2016提高A組五校聯考1 挖金礦

剛看到這題時,還在想怎麼貪心,然後很快的打完之後發現貪心是錯的。然後仔細的看了看範圍,哈哈,這不是二分嗎。二分出乙個mid,然後在所有行裡面用mid j 字首和然後找乙個最大值。最後把這些最大值加起來,判斷一下就好了。include include include include include i...

NOIP2016提高A組五校聯考1 挖金礦

答案,保留4位小數 4 3 4 3 3 5 1 6 2 6 1 3 2 9 4.4286 n m 100000 很簡單的一道題 設sum i j 表示第i列向下挖j行的字首和 假設第i列挖h i 行 設二分的答案是m,答案如果合法,那麼 n i 1s um i h i ni 1 h i m 移項 i...