JZOJ 4673. 4504. 5635. 【NOI2018模拟4.7】LCS
Description
Input
Output
Sample Input
【樣例輸入1】
3 3
aaa
【樣例輸入2】
3 3
aab
【樣例輸入3】
1 2
a
【樣例輸入4】
10 9
abacadefgh
Sample Output
【樣例輸出1】
6
【樣例輸出2】
11
【樣例輸出3】
1
【樣例輸出4】
789
Data Constraint
Solution
考慮用算重的方案數(shù)-重復(fù)的方案數(shù)。
我們可以把原串以相同字符為一塊分成很多塊,因?yàn)橥粔K內(nèi)字符都有同樣的作用。
像 aaabbacc 這樣的字符串,就變成 aaa|bb|a|cc ,每一塊內(nèi)都統(tǒng)計(jì)一次答案。
一個(gè)字符被挖去后,有 n 個(gè)位置可以選,每個(gè)位置又有 m 種字符可以填。
但是每個(gè)位置又有一種字符會(huì)重復(fù),如 abc ,把 c 挖去,則無(wú)論填 a 的左邊還是右邊都一樣。
這樣 n 個(gè)位置都重復(fù)一遍 ,于是每個(gè)塊都貢獻(xiàn) n?m?n 的答案。
但是這樣還是會(huì)算重!
比如說(shuō)字符串 abab ,把第三個(gè)字符 a 挖去后是 abb ,接到后邊是 abba 。
而把第四個(gè)字符 b 挖去后是 aba ,接到倒數(shù)第二個(gè)位置是 abba 。
它們是一樣的!我們發(fā)現(xiàn)如果是隔位相同的也會(huì)算重一次,
而且隔的位數(shù) k 每多一,它就與前面每個(gè)字符都重復(fù)一遍——它滿足等差數(shù)列的形式。
即第一個(gè)字符重復(fù) 0 次,第二個(gè)字符重復(fù) 1 次,第三個(gè)字符重復(fù) 2 次……
那么這個(gè)長(zhǎng)度為 k 的隔位相同的串就重復(fù)了 k?(k?1)2 次,減去即可。
時(shí)間復(fù)雜度 O(N) 。
Code
#include<cstdio> using namespace std; typedef long long LL; int n,m,k=1; LL ans=1; char s[100005]; int main() {scanf("%d%d",&n,&m);scanf("%s",s+1);for(int i=2;i<=n;i++) ans+=s[i]!=s[i-1];ans*=(LL)n*m-n;for(int i=2;i<=n;i++)if(k==1) k+=s[i]!=s[i-1]; elseif(s[i]==s[i-2]) k++; else{ans-=(LL)k*(k-1)>>1;k=(s[i]!=s[i-1])+1;}ans-=(LL)k*(k-1)>>1;printf("%lld",ans);return 0; }總結(jié)
以上是生活随笔為你收集整理的JZOJ 4673. 4504. 5635. 【NOI2018模拟4.7】LCS的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JZOJ 5630. 【NOI2018模
- 下一篇: JZOJ 5629. 【NOI2018模