답안 #709962

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
709962 2023-03-15T01:58:43 Z pcc Trener (COCI20_trener) C++14
22 / 110
5 ms 980 KB
#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")

#define ll long long
#define pll pair<ll,ll>
#define fs first
#define sc second
const ll mxn = 51;
const ll mxk = 1505;
const ll mod = 1e9+7;
pll p = {29,31};
pair<pll,pll> vals[mxn][mxk];
pll h[mxn][mxk];
ll dp[mxn][mxk];
ll n,k;
ll pw(ll a,ll b){
    ll re = 1;
    while(b){
        if(b&1)re = re*a%mod;
        a = a*a%mod;
        b>>=1;
    }
    return re;
}
ll inv(ll kk){
    return pw(kk,mod-2);
}
ll mad(ll a,ll b){
    a += b;
    if(a>=mod)a -= mod;
    return a;
}

bool eq(pll &a,pll &b){
    return a.fs == b.fs&&a.sc == b.sc;
}
int main(){
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n>>k;
    for(int i = 0;i<n;i++){
        for(int j = 0;j<k;j++){
            pll tmp = {0,0};
            pll coef = {1,1};
            string s;
            cin>>s;
            for(auto &i:s){
                tmp.fs = mad(tmp.fs,coef.fs*(i-'a'+1));
                tmp.sc = mad(tmp.sc,coef.sc*(i-'a'+1));
                coef.fs = coef.fs*p.fs%mod;
                coef.sc = coef.sc*p.sc%mod;
            }
            h[i][j] = tmp;
            auto t1 = tmp;
            t1.fs = mad(t1.fs,mod-(s[0]-'a'+1))*inv(p.fs)%mod;
            t1.sc = mad(t1.sc,mod-(s[0]-'a'+1))*inv(p.sc)%mod;
            vals[i][j].fs = t1;
            tmp.fs = (tmp.fs+mod-pw(p.fs,i)*(s.back()-'a'+1)%mod)%mod;
            tmp.sc = (tmp.sc+mod-pw(p.sc,i)*(s.back()-'a'+1)%mod)%mod;
            vals[i][j].sc = tmp;
        }
    }
    for(int i = 0;i<n-1;i++){
        if(i == 0)for(int j = 0;j<k;j++)dp[i][j] = 1;
        for(int j = 0;j<k;j++){
            for(int kk = 0;kk<k;kk++){
                if(eq(h[i][j],vals[i+1][kk].fs)||eq(h[i][j],vals[i+1][kk].sc))dp[i+1][kk] = mad(dp[i+1][kk],dp[i][j]);
            }
        }
    }
    // for(int i = 0;i<n;i++){
        // for(int j =0 ;j<k;j++)cout<<dp[i][j]<<' ';cout<<endl;
    //     for(int j = 0;j<k;j++)cout<<vals[i][j].fs.fs<<' '<<vals[i][j].fs.sc<<',';cout<<endl;
    // }
    ll ans = 0;
    for(int i = 0;i<k;i++)ans = mad(ans,dp[n-1][i]);
    cout<<ans;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 5 ms 980 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 0 ms 340 KB Output is correct
5 Incorrect 5 ms 980 KB Output isn't correct
6 Halted 0 ms 0 KB -