Pagini recente » Cod sursa (job #700138) | Monitorul de evaluare | Cod sursa (job #3347692) | Cod sursa (job #324797) | Cod sursa (job #3347716)
#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;
}