文字列を回転させたもののうち、元の文字列と一致するものが K 個になるようなのを magic word ということにして、
いくつかの文字列をいろんな順序でつなげたもののうち magic word になるようなやつの個数を求める。
class MagicWords { public: int count(vector <string> S, int K) { int N=S.size(); VI p(N); REP(i, N) p[i]=i; int L = 0; REP(i, N) L+=S[i].size(); if(L%K==0) { int ans = 0; do { string s = ""; REP(i, N) s+=S[p[i]]; for(int l=1;l<=L;l++) { if(L%l!=0) continue; int k=L/l; int ok=1; REP(i, L/k) REP(j, k) if(s[i]!=s[j*L/k+i]) ok=0; if(ok) { if(k==K) ans++; break; } } //cout<<s<<" "<<ok<<endl; } while(next_permutation(ALL(p))); return ans; } return 0; }