南昌邀请赛的题,字典树
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll A[26]; string s[100005]; ll trie[200008][26]; ll v[200005]; ll tot=1; ll cnt[200005]; ll B[100005]; ll n,mod; void insert(string s,int x) { int p=1; int len=s.length(); ll t=1; for(int i=0;i<len;i++){ t=(t*A[s[i]-'a'])%mod; if(trie[p][s[i]-'a']==0){ trie[p][s[i]-'a']=++tot; } p=trie[p][s[i]-'a']; cnt[p]++; v[p]=t; } B[x]=t; } ll ans=0; void search(string s,int x) { int p=1; int len=s.length(); for(int i=0;i<len;i++){ p=trie[p][s[i]-'a']; if(v[p]>B[x]){ ans+=cnt[p]; } } } int main() { scanf("%lld%lld",&n,&mod); for(int i=0;i<26;i++){ scanf("%lld",&A[i]); } for(int i=0;i<n;i++){ cin>>s[i]; insert(s[i],i); } for(int i=0;i<n;i++){ search(s[i],i); cout<<ans<<' '; ans=0; } }