QOJ.ac

QOJ

ID提交记录ID题目HackerOwner结果提交时间测评时间
#1565#904851#10093. Jump the FrogIgnite segment tree (Jiaqi Liu, Xinyue Li)sckrtFailed.2025-02-19 17:01:092025-02-19 17:01:09

詳細信息

Extra Test:

Accepted
time: 2829ms
memory: 193216kb

input:

1 20 100000
OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO...

output:

760200498 823117853 25769623 486900225 586932040 82483306 585181565 327978465 989490335 158069117 152977529 75180524 83998311 507250332 816793056 92739405 569632622 346727360 933287192 458930895 375772472 577525089 435342802 968857704 582547912 501759049 411294924 897772460 800930401 221323839 98132...

result:

ok 100001 numbers

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#904851#10093. Jump the FrogsckrtAC ✓2832ms365456kbC++142.3kb2025-02-18 17:43:142025-02-18 17:43:24

answer

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+5,maxk=21,mod=998244353;

int dp[maxn][maxk][maxk];
int len[maxn],tdp[maxn],sum[maxk];
string s[maxn];

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int n,K,a;
    cin>>n>>K>>a;
    auto mislen=[&](string &s) -> void
    {
        if(s.length()<=2*K) return;
        string tmp;
        for(int i=0;i<K;++i)
            tmp.push_back(s[i]);
        for(int i=s.length()-K;i<s.length();++i)
            tmp.push_back(s[i]);
        s=tmp;
    };
    auto addmod=[&](int x,int y) -> int
    {
        x+=y;
        return x>=mod?x-mod:x;
    };
    for(int o=1;o<=n;++o)
    {
        cin>>s[o];
        len[o]=s[o].size();
        for(int i=1;i<=K&&i<=len[o];++i)
        {
            tdp[i-1]=0;
            tdp[i]=(s[o][i-1]=='O');
            if(len[o]-i+1<=K) dp[o][i][len[o]-i+1]=tdp[i];
            for(int j=i+1;j<=len[o];++j)
            {
                tdp[j]=0;
                if(s[o][j-1]=='O') tdp[j]=addmod(tdp[j-1],mod-tdp[max(i,j-K)-1]);
                if(len[o]-j+1<=K) dp[o][i][len[o]-j+1]=tdp[j];
                tdp[j]=addmod(tdp[j-1],tdp[j]);
            }
        }
        mislen(s[o]);
        len[o]=s[o].length();
        cout<<dp[o][1][1]<<' ';
    }
    for(int o=n+1;o<=n+a;++o)
    {
        int o1,o2;
        cin>>o1>>o2;
        s[o]=s[o1]+s[o2];
        mislen(s[o]);
        len[o]=s[o].length();
        for(int i=1;i<=K&&i<=len[o];++i)
            for(int j=1;j<=K&&len[o]-j+1>=i;++j)
            {
                if(s[o][i-1]=='~'||s[o][len[o]-j]=='~') continue;
                if(j>len[o2]) dp[o][i][j]=dp[o1][i][j-len[o2]];
                else if(i>len[o1]) dp[o][i][j]=dp[o2][i-len[o1]][j];
                else
                {
                    for(int l=1;l<=K&&l<=len[o2]-j+1;++l)
                        sum[l]=addmod(sum[l-1],dp[o2][l][j]);
                    for(int l=1;l<=K&&i<=len[o1]-l+1;++l)
                    {
                        if(s[o1][len[o1]-l]=='O')
                            dp[o][i][j]=addmod(dp[o][i][j],1ll*dp[o1][i][l]*sum[min(K-l+1,len[o2]-j+1)]%mod);
                    }
                }
            }
        cout<<dp[o][1][1]<<' ';
    }
}