SSFOJ P1453 子序列(一) 题解
每日一题 day61 打卡
Analysis
las数组表示的是最近一个为j的位置为是什么。
dp数组的含义是以str[i]为结尾的子序列数量。
于是有状态转移方程:
dp[las[i][j]]+=dp[i];
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define int long long 6 #define maxn 1000000+10 7 #define mod 998244353 8 #define rep(i,s,e) for(register int i=s;i<=e;++i) 9 #define dwn(i,s,e) for(register int i=s;i>=e;--i) 10 using namespace std; 11 inline int read() 12 { 13 int x=0,f=1; 14 char c=getchar(); 15 while(c<'0'||c>'9') {if(c=='-') f=-1; c=getchar();} 16 while(c>='0'&&c<='9') {x=x*10+c-'0'; c=getchar();} 17 return f*x; 18 } 19 void write(int x) 20 { 21 if(x<0) {putchar('-'); x=-x;} 22 if(x>9) write(x/10); 23 putchar(x%10+'0'); 24 } 25 int n,ans; 26 char a[maxn]; 27 int m[31],dp[maxn]; 28 int las[maxn][31]; 29 signed main() 30 { 31 n=read(); 32 scanf("%s",a+1); 33 rep(i,0,26) m[i]=n+1; 34 dwn(i,n,0) 35 { 36 rep(j,0,25) 37 { 38 las[i][j]=m[j]; 39 if(i==0) continue; 40 } 41 m[a[i]-'a']=i; 42 } 43 44 dp[0]=1; 45 rep(i,0,n) 46 { 47 rep(j,0,25) 48 { 49 dp[las[i][j]]+=dp[i]; 50 dp[las[i][j]]%=mod; 51 } 52 } 53 rep(i,1,n) 54 { 55 ans+=dp[i]; 56 ans%=mod; 57 } 58 write(ans); 59 return 0; 60 }
请各位大佬斧正(反正我不认识斧正是什么意思)