- Quiz
- AC
- 問題意図
- *で隠された文字列sがある
- a~zの文字のうち、宣言したら確実に*のいずれかが開く文字の個数を求めよ
- 解説
- editorialがないので書いておく
- 答えの候補wordがM個与えられるが、すでに候補になりえないものは除外しておく
- そして残った本当の候補たちについて、各文字cを宣言した時に候補全てが反応するならcは言うべき文字
- 詳しくはコメント多めのコードを参照ください
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
ll N;
cin>>N;
string s;cin>>s;
set<char> already;
for(char c : s){
if(c!='*')already.insert(c);
}
debug(already);
set<char> candidate;
rep(i,26){
char c = 'a'+i;
if(already.count(c))continue;
candidate.insert(c);
}
debug(candidate);
ll M;cin>>M;
VS S;
rep(i,M){
string t;cin>>t;
bool take=true;
rep(j,N){
if(s[j]!='*')continue;
if(already.count(t[j]))take=false;
}
rep(j,N){
if(s[j]!='*' && s[j]!=t[j])take=false;
}
if(take)S.push_back(t);
}
debug(S);
ll sz=SZ(S);
ll ans=0;
for(char c : candidate){
VI F(sz);
rep(j,N){
if(s[j]!='*')continue;
rep(k, sz){
string t = S[k];
if(t[j]==c)F[k]=1;
}
}
if(SUM(F)==sz)ans++;
}
p(ans);
return 0;
}