Cod sursa(job #3347716)

Utilizator tudorhTudor Horobeanu tudorh Data 18 martie 2026 01:35:03
Problema Infasuratoare convexa Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.76 kb
#include <bits/stdc++.h>
#define pii pair<int,int>
#define pb push_back
#define ll long long
using namespace std;
///din noduri care nu sunt au finaluri mai sus de ele, eu ma extind in afara cu un nod care are (k-cnt) modalitati
///fixez prefixul pana acolo
///ways[l]=sum(i,[1,l]): cnt[i]*k^(l-i)
///ways[l]=ways[l-1]*k+cnt[l]
///cand pun un cuvant de lungime l, cnt[l] scade cu 1
ifstream fin("f.in");
ofstream fout("f.out");
const int SMAX=3e5,NMAX=3e5,XMAX=3e5,MOD=1e9+7;
int n,m,k,x[NMAX+1],nodes;
ll cnt[XMAX+2];
struct Trie {
    int child[26]= {0},cnt=0;
    bool is_end=0;
} t[XMAX+5];
void add(int nod,string& s,int pos) {
    if(pos==s.size()) {
        t[nod].is_end=1;
        return;
    }
    if(!t[nod].child[s[pos]-'a']){
        t[nod].child[s[pos]-'a']=++nodes;
        t[nod].cnt++;
    }
    add(t[nod].child[s[pos]-'a'],s,pos+1);
}
void build_cnt(int nod,int pos) {
    if(t[nod].is_end)
        return;
    cnt[pos+1]+=(k-t[nod].cnt);
    for(int i=0; i<26; i++)
        if(t[nod].child[i])
            build_cnt(t[nod].child[i],pos+1);
}
void read() {
    string s;
    int v;
    cin>>n>>m>>k;
    while(n--) {
        cin>>s;
        add(0,s,0);
    }
    for(int i=1; i<=m; i++) {
        cin>>v;
        x[v]++;
    }
}
void solve() {
    read();
    build_cnt(0,0);
    ll r=1,pos_cur=0,cnt_cur=0;
    for(int i=1; i<=XMAX; i++) {
        while(pos_cur<i) {
            pos_cur++;
            cnt_cur=(cnt_cur*k+cnt[pos_cur])%MOD;
        }
        while(x[i]--) {
            r*=cnt_cur;
            r%=MOD;
            cnt_cur=(cnt_cur-1+MOD)%MOD;
        }
    }
    cout<<r;
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    solve();
    return 0;
}