/* ▄▌▐▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▌ ▄▄██▌█ 宅急便です! ▄▄▄▌▐██▌█ Rating +25 :) をお届けに参りました! ███████▌█▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▌ ▀(⊙)▀▀▀▀(⊙)(⊙)▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀(⊙ */ use std::collections::BTreeSet; use proconio::input; use proconio::marker::Chars; static INF: u64 = 1e18 as u64; trait ChLibs { fn chmin(&mut self, elm: T) -> bool; fn chmax(&mut self, elm: T) -> bool; } impl ChLibs for T { fn chmin(&mut self, elm: T) -> bool { return if *self > elm { *self = elm; true } else { false } } fn chmax(&mut self, elm: T) -> bool { return if *self < elm { *self = elm; true } else { false } } } fn solve(){ input! { n: usize, ss: [Chars; n] } let mut set :BTreeSet> = BTreeSet::new(); for i in 0..n { for j in 0..n { if i == j { continue; } let mut s1= ss[i].clone(); let s2 = ss[j].clone(); s1.append(&mut s2.clone()); set.insert(s1); } } println!("{}", set.len()); } fn main() { // input! { i: usize } let mut i = 1; while i != 0 { solve(); i -= 1; } }