
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) {
    FastReader sc = new FastReader();
    int n = sc.nextInt();
    Map<String, Long> map = new HashMap<>();
    
    for (int i = 0; i < n; i++) {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    }
    long res = 0;
    
    for (String key: map.keySet()) {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    }
    
    System.out.println(res);
  }

  static class FastReader {
    BufferedReader br;
    StringTokenizer st;

    public FastReader() {
      br = new BufferedReader(new InputStreamReader(System.in));
    }
  
    String next() { 
      while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      }
      return st.nextToken();
    }

    int nextInt() {
      return Integer.parseInt(next());
    }

    long nextLong() {
      return Long.parseLong(next());
    }

    double nextDouble() { 
      return Double.parseDouble(next());
    }

    String nextLine() {
      String str = "";
        try{
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
      }
  }
} import java.io.BufferedReader; BufferedReader java.io import java.io.IOException; IOException java.io import java.io.InputStreamReader; InputStreamReader java.io import java.util.Arrays; Arrays java.util import java.util.HashMap; HashMap java.util import java.util.Map; Map java.util import java.util.StringTokenizer; StringTokenizer java.util public class Main {
  public static void main(String[] args) {
    FastReader sc = new FastReader();
    int n = sc.nextInt();
    Map<String, Long> map = new HashMap<>();
    
    for (int i = 0; i < n; i++) {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    }
    long res = 0;
    
    for (String key: map.keySet()) {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    }
    
    System.out.println(res);
  }

  static class FastReader {
    BufferedReader br;
    StringTokenizer st;

    public FastReader() {
      br = new BufferedReader(new InputStreamReader(System.in));
    }
  
    String next() { 
      while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      }
      return st.nextToken();
    }

    int nextInt() {
      return Integer.parseInt(next());
    }

    long nextLong() {
      return Long.parseLong(next());
    }

    double nextDouble() { 
      return Double.parseDouble(next());
    }

    String nextLine() {
      String str = "";
        try{
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
      }
  }
} Main public static void main(String[] args) {
    FastReader sc = new FastReader();
    int n = sc.nextInt();
    Map<String, Long> map = new HashMap<>();
    
    for (int i = 0; i < n; i++) {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    }
    long res = 0;
    
    for (String key: map.keySet()) {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    }
    
    System.out.println(res);
  } main {
    FastReader sc = new FastReader();
    int n = sc.nextInt();
    Map<String, Long> map = new HashMap<>();
    
    for (int i = 0; i < n; i++) {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    }
    long res = 0;
    
    for (String key: map.keySet()) {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    }
    
    System.out.println(res);
  } FastReader sc = new FastReader(); sc new FastReader() int n = sc.nextInt(); n sc.nextInt() sc.nextInt sc Map<String, Long> map = new HashMap<>(); map new HashMap<>() for (int i = 0; i < n; i++) {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    } int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    } {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    } String s = sc.next(); s sc.next() sc.next sc char[] tmpChar = s.toCharArray(); tmpChar s.toCharArray() s.toCharArray s Arrays.sort(tmpChar) Arrays.sort Arrays tmpChar String key = new String(tmpChar); key new String(tmpChar) if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	} map.containsKey(key) map.containsKey map key {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		} map.get(key) == 0 map.get(key) map.get map key 0 {
    			map.put(key, 1L);
    		} map.put(key, 1L) map.put map key 1L {
    			map.put(key, map.get(key) + 1);
    		} map.put(key, map.get(key) + 1) map.put map key map.get(key) + 1 map.get(key) map.get map key 1 {
    		map.put(key, 0L);
    	} map.put(key, 0L) map.put map key 0L long res = 0; res 0 for (String key: map.keySet()) {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    } String key map.keySet() map.keySet map {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    } {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    } long a = map.get(key); a map.get(key) map.get map key res += (((a + 1) * a) / 2) res (((a + 1) * a) / 2) ((a + 1) * a) (a + 1) a 1 a 2 System.out.println(res) System.out.println System.out System System.out res String[] args args static class FastReader {
    BufferedReader br;
    StringTokenizer st;

    public FastReader() {
      br = new BufferedReader(new InputStreamReader(System.in));
    }
  
    String next() { 
      while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      }
      return st.nextToken();
    }

    int nextInt() {
      return Integer.parseInt(next());
    }

    long nextLong() {
      return Long.parseLong(next());
    }

    double nextDouble() { 
      return Double.parseDouble(next());
    }

    String nextLine() {
      String str = "";
        try{
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
      }
  } FastReader BufferedReader br; br StringTokenizer st; st public FastReader() {
      br = new BufferedReader(new InputStreamReader(System.in));
    } FastReader {
      br = new BufferedReader(new InputStreamReader(System.in));
    } br = new BufferedReader(new InputStreamReader(System.in)) br new BufferedReader(new InputStreamReader(System.in)) String next() { 
      while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      }
      return st.nextToken();
    } next { 
      while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      }
      return st.nextToken();
    } while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      } st == null || !st.hasMoreElements() st == null st null !st.hasMoreElements() st.hasMoreElements() st.hasMoreElements st {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      } try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        } catch (IOException  e) {
          e.printStackTrace();
        } IOException  e {
          e.printStackTrace();
        } e.printStackTrace() e.printStackTrace e {
          st = new StringTokenizer(br.readLine());
        } st = new StringTokenizer(br.readLine()) st new StringTokenizer(br.readLine()) return st.nextToken(); st.nextToken() st.nextToken st int nextInt() {
      return Integer.parseInt(next());
    } nextInt {
      return Integer.parseInt(next());
    } return Integer.parseInt(next()); Integer.parseInt(next()) Integer.parseInt Integer next() next long nextLong() {
      return Long.parseLong(next());
    } nextLong {
      return Long.parseLong(next());
    } return Long.parseLong(next()); Long.parseLong(next()) Long.parseLong Long next() next double nextDouble() { 
      return Double.parseDouble(next());
    } nextDouble { 
      return Double.parseDouble(next());
    } return Double.parseDouble(next()); Double.parseDouble(next()) Double.parseDouble Double next() next String nextLine() {
      String str = "";
        try{
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
      } nextLine {
      String str = "";
        try{
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
      } String str = ""; str "" try{
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } IOException e {
            e.printStackTrace();
        } e.printStackTrace() e.printStackTrace e {
            str = br.readLine();
        } str = br.readLine() str br.readLine() br.readLine br return str; str public class Main {
  public static void main(String[] args) {
    FastReader sc = new FastReader();
    int n = sc.nextInt();
    Map<String, Long> map = new HashMap<>();
    
    for (int i = 0; i < n; i++) {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    }
    long res = 0;
    
    for (String key: map.keySet()) {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    }
    
    System.out.println(res);
  }

  static class FastReader {
    BufferedReader br;
    StringTokenizer st;

    public FastReader() {
      br = new BufferedReader(new InputStreamReader(System.in));
    }
  
    String next() { 
      while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      }
      return st.nextToken();
    }

    int nextInt() {
      return Integer.parseInt(next());
    }

    long nextLong() {
      return Long.parseLong(next());
    }

    double nextDouble() { 
      return Double.parseDouble(next());
    }

    String nextLine() {
      String str = "";
        try{
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
      }
  }
} public class Main {
  public static void main(String[] args) {
    FastReader sc = new FastReader();
    int n = sc.nextInt();
    Map<String, Long> map = new HashMap<>();
    
    for (int i = 0; i < n; i++) {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    }
    long res = 0;
    
    for (String key: map.keySet()) {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    }
    
    System.out.println(res);
  }

  static class FastReader {
    BufferedReader br;
    StringTokenizer st;

    public FastReader() {
      br = new BufferedReader(new InputStreamReader(System.in));
    }
  
    String next() { 
      while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      }
      return st.nextToken();
    }

    int nextInt() {
      return Integer.parseInt(next());
    }

    long nextLong() {
      return Long.parseLong(next());
    }

    double nextDouble() { 
      return Double.parseDouble(next());
    }

    String nextLine() {
      String str = "";
        try{
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
      }
  }
} Main

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class Main {
  public static void main(String[] args) {
    FastReader sc = new FastReader();
    int n = sc.nextInt();
    Map<String, Long> map = new HashMap<>();
    
    for (int i = 0; i < n; i++) {
    	String s = sc.next();
    	char[] tmpChar = s.toCharArray();
    	Arrays.sort(tmpChar);
    	String key = new String(tmpChar);
    	
    	if (map.containsKey(key)) {
    		if (map.get(key) == 0) {
    			map.put(key, 1L);
    		} else {
    			map.put(key, map.get(key) + 1);
    		}
    	} else {
    		map.put(key, 0L);
    	}
    }
    long res = 0;
    
    for (String key: map.keySet()) {
    	long a = map.get(key);
    	res += (((a + 1) * a) / 2);
    }
    
    System.out.println(res);
  }

  static class FastReader {
    BufferedReader br;
    StringTokenizer st;

    public FastReader() {
      br = new BufferedReader(new InputStreamReader(System.in));
    }
  
    String next() { 
      while (st == null || !st.hasMoreElements()) {
        try {
          st = new StringTokenizer(br.readLine());
        } catch (IOException  e) {
          e.printStackTrace();
        }
      }
      return st.nextToken();
    }

    int nextInt() {
      return Integer.parseInt(next());
    }

    long nextLong() {
      return Long.parseLong(next());
    }

    double nextDouble() { 
      return Double.parseDouble(next());
    }

    String nextLine() {
      String str = "";
        try{
            str = br.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return str;
      }
  }
}
