Description
Input
Output
Sample
Input1:
3 3
aaa
Output1:
6
Input2:
3 3
aab
Output2:
11
Input3:
1 2
a
Output3:
1
Input4:
10 9
abacadefgh
Output4:
789
Data Constraint
Hint
Analysis
一看就是DP
设
f[i][0→7]
f
[
i
]
[
0
→
7
]
表示做到第i位,各种形态的方案数
这样写方程推起来有一点呵呵
#include<cstring>
#include<cstdio>
#define N 100100
#define ll long long
using namespace std;
ll f[N][8];
int n,m,a[N];
int main(){
freopen("lcs.in","r",stdin);
freopen("lcs.out","w",stdout);
scanf("%d %d\n",&n,&m);
for(int i=1;i<=n;i++)a[i]=getchar()-'a';a[n+1]=a[0]=-1;
f[0][0]=1;
for(int i=1;i<=n;i++){
if(f[i-1][0]){
f[i][0]+=f[i-1][0];
if(a[i]!=a[i+1] && a[i+1]>=0)f[i][7]+=f[i-1][0];
if(a[i]==a[i+1] || a[i+1]<0)f[i][2]+=f[i-1][0]*(ll)(m-1);else f[i][2]+=f[i][0]*(ll)(m-2);
}
if(f[i-1][1])f[i][1]+=f[i-1][1];
if(f[i-1][2]){
if(a[i]!=a[i-1])f[i][1]+=f[i-1][2];
f[i][3]+=f[i-1][2];
}
if(f[i-1][3]){
f[i][3]+=f[i-1][3];
if(a[i]!=a[i-1])f[i][1]+=f[i-1][3];
}
if(f[i-1][4]){
if(a[i]!=a[i-1] && a[i]!=a[i-2])f[i][1]+=f[i-1][4];
if(a[i]!=a[i-2])f[i][3]+=f[i-1][4];
if(a[i]==a[i-2] && a[i+1]!=a[i-1] && a[i+1]>=0)f[i][5]+=f[i-1][4];
if(a[i]==a[i-2])f[i][4]+=f[i-1][4];
if(a[i]==a[i-2]){
if(a[i+1]<0 || a[i+1]==a[i-1])f[i][6]+=f[i-1][4]*(ll)(m-1);
else f[i][6]+=f[i-1][4]*(ll)(m-2);
}
}
if(f[i-1][5]){
if(a[i+1]>=0)f[i][5]+=f[i-1][5];
if(a[i+1]<0)f[i][6]+=f[i-1][5]*(ll)m;else f[i][6]+=f[i-1][5]*(ll)(m-1);
}
if(f[i-1][6])f[i][1]+=f[i-1][6];
if(f[i-1][7]){
f[i][4]+=f[i-1][7];
if(a[i+1]>=0 && a[i+1]!=a[i-1])f[i][5]+=f[i-1][7];
if(a[i+1]<0 || a[i+1]==a[i-1])f[i][6]+=f[i-1][7]*(ll)(m-1);
else f[i][6]+=f[i-1][7]*(ll)(m-2);
}
}printf("%lld",f[n][1]+f[n][2]+f[n][3]+f[n][4]+f[n][5]+f[n][6]+f[n][7]);
fclose(stdin);fclose(stdout);
return 0;
}