Statistics

Problem Statement for "RGBTree"

Problem Statement

You are given a simple undirected graph with n nodes, labeled 0 through n-1. Each edge of this graph is red, green, or blue. You are given a description of the graph in a String[] G. For each pair of nodes (i, j) there are four possibilities:
  • G[i][j] = 'R', meaning that i and j are connected by a red edge.
  • G[i][j] = 'G', meaning that i and j are connected by a green edge.
  • G[i][j] = 'B', meaning that i and j are connected by a blue edge.
  • G[i][j] = '.', meaning that i and j are not connected by an edge.

A spanning tree of our graph is any set S of exactly k = n-1 edges such that it is possible to travel from any node to any other node by only using edges from S. Does our graph have a spanning tree that has exactly k/3 edges of each color (red, green, blue)? If it does, return "Exist". Otherwise, return "Does not exist".

Definition

Class:
RGBTree
Method:
exist
Parameters:
String[]
Returns:
String
Method signature:
String exist(String[] G)
(be sure your method is public)

Constraints

  • n will be between 4 and 13, inclusive.
  • n mod 3 will be 1.
  • G will contain exactly n elements.
  • Each element in G will contain exactly n characters.
  • Each character in G will be one of {'.', 'R', 'G', 'B'}.
  • For each i, G[i][i] = '.'.
  • For each i and j, G[i][j] = G[j][i].

Examples

  1. {".RGB", "R...", "G...", "B..."}

    Returns: "Exist"

    This graph has exactly three edges: one red, one green, and one blue. These three edges form the desired spanning tree.

  2. {".RRB", "R...", "R...", "B..."}

    Returns: "Does not exist"

    This graph does also have a spanning tree. Its only spanning tree contains the edges (0,1), (0,2), and (0,3). However, this spanning tree contains two red and no green edges. Thus, a spanning tree with the desired property does not exist.

  3. {".R..BG..G..RG","R...GG..BR.G.","...G.GG.RR.BB","..G.RR.B..GRB","BG.R.G.BRRR.G","GGGRG.R....RR","..G..R.BGRR..","...BB.B.RB.G.","GBR.R.GR.B.R.",".RR.R.RBB.BRB","...GR.R..B...","RGBR.R.GRR...","G.BBGR...B..."}

    Returns: "Exist"

  4. {".............",".......BB.R..",".......RR....",".....G.G....R","........BB...","...G.........","........B...R",".BRG.......G.",".BR.B.B...GB.","....B......GR",".R......G....",".......GBG..B","...R..R..R.B."}

    Returns: "Does not exist"

  5. {"..B.BB...RB..","......R..B.G.","B.......BB...",".......R...G.","B....GRB..R..","B...G.RG.R...",".R..RR..B.RB.","...RBG...G...","..B...B......","RBB..R.G....R","B...R.R......",".G.G..B.....R",".........R.R."}

    Returns: "Exist"

  6. {"....", "....", "....", "...."}

    Returns: "Does not exist"

    This graph has no spanning trees at all.

  7. {".......R.....","...B.GG.B..B.","...R........B",".BR.R..R..R.R","...R....B.GRR",".G........B..",".G.....B...R.","R..R..B....B.",".B..B.....B.B","...........G.","...RGB..B....",".B..R.RB.G...","..BRR...B...."}

    Returns: "Exist"

  8. {".BB.R...G.R..","B..G..BB.GB..","B..R.B.G..R..",".GR....R..RBB","R.........B..","..B...BB.GGBB",".B...B.GG...G",".BGR.BG.B...B","G.....GB..B.R",".G...G....R..","RBRRBG..BR...","...B.B.......","...B.BGBR...."}

    Returns: "Exist"

  9. {".G.B..B..B..B","G..BRGB..G...",".....RBB..G..","BB...G.B..G..",".R.......R...",".GRG....G.B..","BBB....G.BB.B","..BB..G......",".....G...GRB.","BG..R.B.G..G.","..GG.BB.R...B","........BG..R","B.....B...BR."}

    Returns: "Exist"

  10. {"...G..B....BB","..B..RB.BGRG.",".B......R...B","G....R...R.G.","......RB...GR",".R.R..BRB...G","BB..RB.B..G..","....BRB....B.",".BR..B...B.G.",".G.R....B.G.B",".R....G..G..R","BG.GG..BG....","B.B.RG...BR.."}

    Returns: "Exist"

  11. {"....BRB.B..B.","...G...R.G.GB","......RGBBB..",".G..B.R.BRBB.","B..B.G..R..R.","R...G.RG.GR..","B.RR.R....B..",".RG..G.......","B.BBR......G.",".GBR.G....GB.","..BB.RB..G.B.","BG.BR...GBB.B",".B.........B."}

    Returns: "Exist"

  12. {"..BBGG.GRR.BR","...GB....GBR.","B..GB..R.G.G.","BGG..G.GR.B.R","GBB..GB...GB.","G..GG.GG..B..","....BG.R.B...","G.RG.GR..B...","R..R.....BB.R","RGG...BBB.GG.",".B.BGB..BG...","BRG.B....G...","R..R....R...."}

    Returns: "Exist"

  13. {".R.RB....BG..","R...B...GB..B","........R..BR","R...........B","BB...RB..BB..","....R........","....B.....RG.","........BBBR.",".GR....B.BG..","BB..B..BB...R","G...B.RBG....","..B...GR.....",".BRB.....R..."}

    Returns: "Exist"

  14. {"..G..BBBGBR.B",".......B...BR","G...BG..BRG..",".....B..R.GB.","..B..R..B....","B.GBR...R..G.","B......G....B","BB....G.G..B.","G.BRBR.G.B.BB","B.R.....B.R.B","R.GG.....R..R",".B.B.G.BB...B","BR....B.BBRB."}

    Returns: "Exist"

  15. {".R..B....BR..","R..R.BBGBBG..","...B..B.GBG.R",".RB..BG.B....","B.......BB...",".B.B.....GBRB",".BBG...R.BG..",".G....R.BR.R.",".BGBB..B.R..G","BBB.BGBRR....","RGG..BG.....G",".....R.R.....","..R..B..G.G.."}

    Returns: "Exist"

  16. {"........B.B.R","..B..GG..B.B.",".B...B.......",".......BG..GB",".....G..B.B..",".GB.G..RBR...",".G......G..B.","...B.R..B.B..","B..GBBGB...G.",".B...R....B..","B...B..B.B.B.",".B.G..B.G.B..","R..B........."}

    Returns: "Does not exist"

  17. {".....B.GB.RB.","...G...B..B.B","......G...B.R",".G..BG...B..G","...B......R..","B..G...BBG.BG","..G.....GBR..","GB...B..B....","B....BGB.B..R","...B.GB.B....","RBB.R.R....B.","B....B....B.B",".BRG.G..R..B."}

    Returns: "Exist"

  18. {"...B..R....BR","....B.RB.R..B","............B","B......B.BGRB",".B...G....B..","....G..BB..RB","RR.......R...",".B.B.B...BB..",".....B.....B.",".R.B..RB...B.","...GB..B.....","B..R.R..BB...","RBBB.B......."}

    Returns: "Does not exist"

  19. {".BGB..B.R.BGB","B......R..B.R","G........B.RR","B..........R.",".......B..R.B","............G","B......B.B..B",".R..B.B...BBR","R........B...","..B...B.B.BR.","BB..R..B.B..B","G.RR...B.R...","BRR.BGBR..B.."}

    Returns: "Does not exist"

  20. {"...GG...G....","..R..R.G...B.",".R.B...BB...B","G.B....BBRBB.","G......B..B.B",".R.....B...BR","............B",".GBBBB..G....","G.BB...G.....","...R......G..","...BB....G..R",".B.B.B......R","..B.BRB...RR."}

    Returns: "Exist"

  21. {"...R..G.G...G","........RRRB.","...BGG..R....","R.B..BB.B....","..G.....B.B..","..GB..R...B..","G..B.R.......","........BB.G.","GRRBB..B..R.R",".R.....B.....",".R..BB..R....",".B.....G.....","G.......R...."}

    Returns: "Exist"

  22. {".....B...BG.B","........G.GG.","....B..GB.R.G",".....B....BBB","..B..G.RB.B..","B..BG.B...G..",".....B.B...RB","..G.R.B.GB.RG",".GB.B..G.....","B......B....B","GGRBBG.....B.",".G.B..RR..B.R","B.GB..BG.B.R."}

    Returns: "Exist"

  23. {".R..BRBB.....","R......RR..G.","....B.BB.....","....BR.......","B.BB..R.GB...","R..R...GBR.GG","B.B.R.......G","BRB..G...G.RB",".R..GB....RB.","....BR.G...R.","........R...R",".G...G.RBR..R",".....GGB..RR."}

    Returns: "Exist"

  24. {".B..G...G.GRB","B..B..GR....B","...B......BR.",".BB..GG.B.G.G","G.....RR...BG","...G..R...B..",".G.GRR..B.GGB",".R..R.....B..","G..B..B....R.","..........GBB","G.BG.BGB.G.B.","R.R.B.G.RBB..","BB.GG.B..B..."}

    Returns: "Exist"

  25. {".....R..R..GG","...B.B.GRRG.B",".....GBB.GB.B",".B...G..R.B.G",".........R.BB","RBGG..RG.B...","..B..R...BGB.",".GB..G..B.R..","RR.R...B...BR",".RG.RBB...B.G",".GBB..GR.B...","G...B.B.B....","GBBGB...RG..."}

    Returns: "Exist"

  26. {"..R..RRG.B.BG","..BB..BG.R.G.","RB....R...G.R",".B..G.......B","...G........G","R........B.RR","RBR.....GBBB.","GG.......B.B.","......G....R.","BR...BBB..BG.","..G...B..B.BB","BG...RBBRGB.B","G.RBGR....BB."}

    Returns: "Exist"

  27. {"..BR...BBB.B.",".....G....BBG","B....BBRB..G.","R....B.R..BBG",".......R..B..",".GBB..R......","..B..R...R...","B.RRR....BR..","B.B.......BG.","B.....RB..B..",".B.BB..RBB.B.","BBGB....G.B..",".G.G........."}

    Returns: "Exist"

  28. {"......GB.B...","....RR.....B.","........B..BG","....G...B....",".R.G.B.R.B.GR",".R..B..G.G...","G......G.B.GR","B...RGG...B..","..BB......B.R","B...BGB.....B",".......BB....",".BB.G.G.....B","..G.R.R.RB.B."}

    Returns: "Exist"

  29. {"....G....RB..","..G..BG.B.B.G",".G..R.B..B...",".......B.....","G.R...B..G...",".B....B.B..GG",".GB.BB..B..BG","...B.....B...",".B...BB...B..","R.B.G..B....R","BB......B...B",".....GB.....B",".G...GG..RBB."}

    Returns: "Does not exist"

  30. {".G..R..B.G..B","G..B...G..RB.","........G.B.B",".B....B..GB.G","R....BRG..R..","....B...RG..R","...BR.......B","BG..G...BR...","..G..R.B.....","G..G.G.R.....",".RBBR........",".B...........","B.BG.RB......"}

    Returns: "Exist"

  31. {"..B.G...GB","..B.G.BBBR","BB..RR....","....G.GBGG","GGRG......","..R...B.BR",".B.G.B.RBG",".B.B..R...","GB.G.BB..G","BR.G.RG.G."}

    Returns: "Exist"

  32. {"......R...","..B.RRR.BB",".B.BR..R.R","..B..B.RRG",".RR..BRR.R",".R.BB.RRRR","RR..RR..GB","..RRRR....",".B.R.RG...",".BRGRRB..."}

    Returns: "Does not exist"

  33. {".R..B...B.","R.R..R..BB",".R.GB..RBB","..G....R.B","B.B..RG...",".R..R.R.B.","....GR..RB","..RR....R.","BBB..BRR.G",".BBB..B.G."}

    Returns: "Exist"

  34. {".RGRR.R","R.G.R.B","GG..R..","R.....G","RRR..GR","....G.R","RB.GRR."}

    Returns: "Does not exist"

  35. {".RGR..RB...BR","R...B.BR...GG","G...BB.......","R......R.B...",".BB..G......B","..B.G.RRG...B","RB...R....GB.","BR.R.R...B...",".....G....RB.","...B...B..RR.","......G.RR...","BG....B.BR...","RG..BB......."}

    Returns: "Exist"

  36. {"....G.GG.GBB.","....GGG..G..B",".....RG.GG...",".....BGB...BB","GG....G....B.",".GRB..BG.....","GGGGGB.RGGR.B","G..B.GR..RG.G","..G...G..BRB.","GGG...GRB.B.B","B.....RGRB...","B..BB...B....",".B.B..BG.B..."}

    Returns: "Exist"

  37. {".GG....","G.R.R.R","GR.RG.G","..R.R..",".RGR...","......G",".RG..G."}

    Returns: "Does not exist"

  38. {"..BB","..BR","BB.B","BRB."}

    Returns: "Does not exist"

  39. {".R.....G..","R...BR.R..",".....G..GG",".....R.G..",".B......G.",".RGR..R.RG",".....R.R..","GR.G..R..G","..G.GR....","..G..G.G.."}

    Returns: "Does not exist"

  40. {"..RB..B..RR.R","...BGB......G","R.....B...GB.","BB....B......",".G...RG...RB.",".B..R....R...","B.BBG..G...G.","......G.B.BGR",".......B..GR.","R....R....B.B","R.G.R..BGB...","..B.B.GGR....","RG.....R.B..."}

    Returns: "Exist"

  41. {"..G...B","..BG.GG","GB..G.G",".G..BBG","..GB.GG",".G.BG.G","BGGGGG."}

    Returns: "Does not exist"

  42. {".BGB.GG","B.RR...","GR.GB.R","BRG.R..","..BR...","G......","G.R...."}

    Returns: "Exist"

  43. {".R..G..","R...R..",".....GG",".......","GR.....","..G....","..G...."}

    Returns: "Does not exist"

  44. {"..G....","..B.RBB","GB.R...","..R...B",".R....B",".B.....",".B.BB.."}

    Returns: "Does not exist"

  45. {".G.....G..","G.GG.G.G..",".G..R.R.B.",".G...R.R..","..R..BG.B.",".G.RB.G..G","..R.GG....","GG.R.....G","..B.B.....",".....G.G.."}

    Returns: "Exist"

  46. {"..RBG.B.R.B..","..G.R....RR..","RG.GR.GRGGGGG","B.G..R...G.G.","GRR..R....R..","...RR...RR...","B.G.......R..","..R.......B..","R.G..R....G.G",".RGG.R....R.G","BRG.R.RBGR..R","..GG.........","..G.....GGR.."}

    Returns: "Exist"

  47. {"..GBBBB","....BB.","G....BG","B...R.B","BB.R.B.","BBB.B..","B.GB..."}

    Returns: "Does not exist"

  48. {".B..BRB","B.RR.R.",".R.GG.B",".RG.R.G","B.GR..B","RR.....","B.BGB.."}

    Returns: "Exist"

  49. {".RG..R.B...G.","R.BR.R...G...","GB...RR...B..",".R....RR...GR",".....R...GBBG","RRR.R.RR.....","..RR.R.G...B.","B..R.RG....G.",".............",".G..G.....R..","..B.B....R.R.","G..GB.BG..R.G","...RG......G."}

    Returns: "Does not exist"

  50. {".RRB....B....","R......B..BG.","R...R..BR....","B....B..G.RRR","..R..B...R...","...BB.......B",".............",".BB......R.BG","B.RG.......R.","....R..R..B.G",".B.R.....B...",".G.R...BR....","...R.B.G.G..."}

    Returns: "Does not exist"

  51. {"..GR.BG","...G.G.","G...G..","RG..R.B","..GR.B.","BG..B.G","G..B.G."}

    Returns: "Exist"

  52. {".BBRBR.","B......","B...GR.","R...BB.","B.GB..R","R.RB...","....R.."}

    Returns: "Does not exist"

  53. {".G.B....G.G..","G...........G","......R..BRGR","B.....G.G...G",".....R.BR.GG.","....R.BB.B.GG","..RG.B.B.G.G.","....BBB...B..","G..GR.......G","..B..BG...GGB","G.R.G..B.G...","..G.GGG..G...",".GRG.G..GB..."}

    Returns: "Exist"

  54. {"....","..R.",".R..","...."}

    Returns: "Does not exist"

  55. {"..RB","..G.","RG.B","B.B."}

    Returns: "Exist"

  56. {".BG.","B.G.","GG..","...."}

    Returns: "Does not exist"

  57. {".....BG","..BG.RR",".B....G",".G..RR.","...R..G","BR.R...","GRG.G.."}

    Returns: "Exist"

  58. {"..GGRGR..G...","..B....BG....","GB..BB..GG..G","G...G..B.G.B.","R.BG.BGBB.G..","G.B.B..B..R..","R...G..B..G.G",".B.BBBB.BG.GB",".GG.B..B....G","G.GG...G..BR.","....GRG..B.B.","...B...G.RB..","..G...GBG...."}

    Returns: "Exist"

  59. {".RG.","R...","G...","...."}

    Returns: "Does not exist"

  60. {".B..RR.R..","B.RG.R....",".R.B..R.R.",".GB.B.B.RR","R..B.RG..R","RR..R...B.","..RBG..RB.","R.....R...","..RR.BB..G","...RR...G."}

    Returns: "Exist"

  61. {"..GG","....","G...","G..."}

    Returns: "Does not exist"

  62. {".R...GG...","R.B.......",".B...B..B.",".....R.BR.","........G.","G.BR....GR","G........G","...B......","..BRGG....",".....RG..."}

    Returns: "Exist"

  63. {".R..R...BR...","R....BR..RG.G","........R.B..","....B....B..B","R..B.B....G..",".B..B...R..RR",".R.........R.","..........BB.","B.R..R......R","RR.B.........",".GB.G..B.....",".....RRB.....",".G.B.R..R...."}

    Returns: "Does not exist"

  64. {"......RGB.","..B....GBB",".B.R.G..B.","..R..G.B.G",".....R.B.B","..GGR...B.","R.........","GG.BB.....","BBB..B....",".B.GB....."}

    Returns: "Exist"

  65. {"..GB....GRR..","...GGB..G..RG","G...BB..G...R","BG..G..B...RG",".GBG.G.G..R..",".BB.G.G.GBB.B",".....G.GG..G.","...BG.G.BB...","GGG..GGB.GG..","R....B.BG...G","R...RB..G...G",".R.R..G......",".GRG.B...GG.."}

    Returns: "Exist"

  66. {".RBGRR.","R.GB.RR","BG..BG.","GB..GGR","R.BG...","RRGG...",".R.R..."}

    Returns: "Exist"

  67. {"..GRB.R.B.R.B",".....B.G..R.R","G..G.R..G....","R.G.G..B..RB.","B..G.RG.....R",".BR.R..B.G.B.","R...G..GBBGG.",".G.B.BG.....G","B.G...B...B.B",".....GB...BB.","RR.R..G.BB.B.","...B.BG..BB..","BR..R..GB...."}

    Returns: "Exist"

  68. {".GR.","G..G","R..R",".GR."}

    Returns: "Does not exist"

  69. {"..GB.GG.B...R","..RGRRGB.G...","GR.BB....BBGG","BGB.B..GBG.B.",".RBB.G.G.RBBG","GR..G.GGR.R.R","GG...G.RGBR..",".B.GGGR...GR.","B..B.RG..RR.R",".GBGR.B.R..B.","..B.BRRGR....","..GBB..R.B...","R.G.GR..R...."}

    Returns: "Exist"

  70. {"....B.....","...RG.GR..","......BG..",".R...G.RB.","BG...G....","...GG....R",".GB....BB.",".RGR..B...","...B..B...",".....R...."}

    Returns: "Exist"

  71. {".B...R.","B.....B","...G.B.","..G.GBG","...G.GB","R.BBG.B",".B.GBB."}

    Returns: "Does not exist"

  72. {"...B.B.B..","....RG.BB.","...B..B.R.","B.B.B...BB",".R.B......","BG.....RG.","..B.....BG","BB...R....",".BRB.GB...","...B..G..."}

    Returns: "Exist"

  73. {".B.....","B..B..B","......B",".B....B","......B","......B",".BBBBB."}

    Returns: "Does not exist"

  74. {"...R......","..GGGG..GB",".G...RR.G.","RG...B....",".G........",".GRB..GRG.","..R..G....",".....R....",".GG..G....",".B........"}

    Returns: "Does not exist"

  75. {"..R..BG","..RBRR.","RR.RG.G",".BR....",".RG...R","BR.....","G.G.R.."}

    Returns: "Exist"

  76. {".G..GG.B.G","G..R....RR","...RGG.BRG",".RR..RR...","G.G..GG...","G.GRG.GGR.","...RGG....","B.B..G...B",".RR..R...B","GRG....BB."}

    Returns: "Exist"

  77. {"..R.","..BB","RB.R",".BR."}

    Returns: "Does not exist"

  78. {"..GBB.G","..G..R.","GG...R.","B.....R","B......",".RR...R","G..R.R."}

    Returns: "Exist"

  79. {"..RG..R.....B","..BR.R...BRGR","RB.BBB...B...","GRB...G.R.G.B","..B..GR..B.BG",".RB.G.R.RB.BB","R..GRR.G.RR..","......G...G..","...R.R....BGB",".BB.BBR.....R",".R.G..RGB..B.",".G..BB..G.B.R","BR.BGB..BR.R."}

    Returns: "Exist"

  80. {".......","....RRR","...R...","..R....",".R.....",".R.....",".R....."}

    Returns: "Does not exist"

  81. {"....","..R.",".R..","...."}

    Returns: "Does not exist"

  82. {".B.B.RR","B.R.R.R",".R..B..","B....R.",".RB..R.","R..RR..","RR....."}

    Returns: "Does not exist"

  83. {".RGR..R","R..BBBR","G..B.B.","RBB.R.R",".B.R...",".BB...R","RR.R.R."}

    Returns: "Does not exist"

  84. {".RBR.BB...","R.G..BBBBB","BG..BG.GB.","R....GG...","..B...B.RG","BBGG...BB.","BB.GB....G",".BG..B..RG",".BB.RB.R..",".B..G.GG.."}

    Returns: "Exist"

  85. {"..RB...GGB...","...B...B...G.","R...B..B.....","BB...B...BR..","..B...B.....B","...B..BB..GBG","....BB.....BB","GBB..B..BBBBB","G......B....B","B..B...B.....","...R.G.B.....",".G...BBB.....","....BGBBB...."}

    Returns: "Does not exist"

  86. {"...G.R....",".........R","..........","G.........",".......B..","R.........","........R.","....B.....","......R...",".R........"}

    Returns: "Does not exist"

  87. {"...RR..","......R",".....GB","R...RRB","R..R...","..GR...",".RBB..."}

    Returns: "Does not exist"

  88. {"........R.","........BR","....RBR...",".....G....","..R.....RB","..BG..B.G.","..R..B...R","..........","RB..RG....",".R..B.R..."}

    Returns: "Does not exist"

  89. {"..G.","..B.","GB.G","..G."}

    Returns: "Does not exist"

  90. {".BGBRBG.RR","B.RGGGRGB.","GR.BRB..G.","BGB...R.GG","RGR..RRG.R","BGB.R.B..G","GR.RRB.BG.",".G..G.B..G","RBGG..G..B","R..GRG.GB."}

    Returns: "Exist"

  91. {".............", ".......BB.R..", ".......RR....", ".....G.G....R", "........BB...", "...G.........", "........B...R", ".BRG.......G.", ".BR.B.B...GB.", "....B......GR", ".R......G....", ".......GBG..B", "...R..R..R.B." }

    Returns: "Does not exist"

  92. {".RRB", "R...", "R...", "B..." }

    Returns: "Does not exist"

  93. {"..B.BB...RB..", "......R..B.G.", "B.......BB...", ".......R...G.", "B....GRB..R..", "B...G.RG.R...", ".R..RR..B.RB.", "...RBG...G...", "..B...B......", "RBB..R.G....R", "B...R.R......", ".G.G..B.....R", ".........R.R." }

    Returns: "Exist"

  94. {".RGB", "R...", "G...", "B..." }

    Returns: "Exist"

  95. {".R.R", "R.G.", ".G.B", "R.B." }

    Returns: "Exist"

  96. {".R..BG..G..RG", "R...GG..BR.G.", "...G.GG.RR.BB", "..G.RR.B..GRB", "BG.R.G.BRRR.G", "GGGRG.R....RR", "..G..R.BGRR..", "...BB.B.RB.G.", "GBR.R.GR.B.R.", ".RR.R.RBB.BRB", "...GR.R..B...", "RGBR.R.GRR...", "G.BBGR...B..." }

    Returns: "Exist"


This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2024, TopCoder, Inc. All rights reserved.
This problem was used for: