Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- #include <string>
- #include <vector>
- #include <map>
- using namespace std;
- // Tree isomorphism
- map< vector<int> , int > M;
- string S;
- int cont;
- int hash(int l, int r){
- vector<int> v;
- v.push_back(0);
- int aux = 0;
- for(int i = l,x = l;i <= r;++i){
- if(S[i] == '0') ++aux;
- else --aux;
- if(aux == 0){
- v.push_back(hash(x + 1,i - 1));
- x = i + 1;
- }
- }
- if(v.size() > 1) sort(v.begin() + 1,v.end());
- v.push_back(1);
- if(M.find(v) == M.end()) M[v] = cont++;
- return M[v];
- }
- // Trie
- int next[10000][10],cont2;
- void add(string s){
- int L = s.size();
- int pos = 0;
- for(int i = 0;i < L;++i){
- if(next[pos][ s[i] - 'a' ] == -1)
- next[pos][ s[i] - 'a' ] = cont2++;
- pos = next[pos][ s[i] - 'a' ];
- }
- }
- int B,L;
- // Trie into string
- string dfs(int pos){
- string ret = "0";
- for(int i = 0;i < B;++i){
- if(next[pos][i] != -1){
- ret += "0";
- ret += dfs(next[pos][i]);
- ret += "1";
- }
- }
- ret += "1";
- return ret;
- }
- int main(){
- //B : numer of different characters
- //L : length of the strings
- cin >> B >> L;
- string s;
- cont = 2;
- vector<string> v;
- v.push_back("");
- for(int i = 0;i < L;++i){
- int L2 = v.size();
- for(int j = 1;j < B;++j)
- for(int k = 0;k < L2;++k)
- v.push_back(v[k]);
- for(int j = 0,k = 0;j < B;++j)
- for(int x = 0;x < L2;++x)
- v[k++] += (char)('a' + j);
- }
- vector< pair<int,string> > H;
- bool have[26];
- for(int i = 0;i < v.size();++i){
- string s = v[i];
- memset(have,false,sizeof have);
- int alph = 0;
- bool ok = true;
- for(int j = 0;j < L;++j){
- if(!have[ s[j] - 'a' ]){
- if(s[j] - 'a' != alph) ok = false;
- have[ s[j] - 'a' ] = true;
- ++alph;
- }
- }
- if(alph < B || !ok) continue;
- memset(next,-1,sizeof next);
- cont2 = 1;
- string s2;
- for(int j = L - 1;j >= 0;--j){
- s2 = s[j] + s2;
- add(s2);
- }
- string ret = dfs(0);
- S = ret;
- int ret2 = hash(0,ret.size() - 1);
- H.push_back(make_pair(ret2,s));
- }
- sort(H.begin(),H.end());
- cout << H.size() << endl;
- for(int i = 0;i < H.size();){
- int e = i;
- while(e < H.size() && H[e].first == H[i].first) ++e;
- for(int j = i;j < e;++j)
- cout << H[j].second << " " << e - i << endl;
- i = e;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement