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 }

请各位大佬斧正(反正我不认识斧正是什么意思)

posted @ 2019-12-17 18:10  handsome_zyc  阅读(181)  评论(0编辑  收藏  举报