-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMoos.java
More file actions
91 lines (83 loc) · 2.67 KB
/
Moos.java
File metadata and controls
91 lines (83 loc) · 2.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
import java.util.*;
import java.io.*;
import java.util.StringTokenizer;
public class Moos {
public static void main(String[] args) throws IOException {
String[] letters = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"};
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(System.out);
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int f = Integer.parseInt(st.nextToken());
String s = br.readLine();
HashMap<String, Integer> initCounts = new HashMap<String, Integer>();
for(int i=0; i< n-2; i++) {
if(s.charAt(i) != s.charAt(i+1) && s.charAt(i+1) == s.charAt(i+2)) {
String sub = s.substring(i, i+3);
if(initCounts.containsKey(sub)) {
initCounts.put(sub, initCounts.get(sub) + 1);
}
else initCounts.put(sub, 1);
}
}
//pw.println(initCounts);
TreeSet<String> ans = new TreeSet<String>();
HashMap<String, Integer> temp = new HashMap<String, Integer>(initCounts);
for(String str : temp.keySet()) {
if(initCounts.get(str) >= f) {
ans.add(str);
initCounts.remove(str);
}
}
temp = new HashMap<String, Integer>(initCounts);
if(f >= 2) {
for(int i=0; i<n-2; i++) {
String sub = s.substring(i, i+3);
for(String str : temp.keySet()) {
boolean affectsPrev = false;
int toBeChanged = -1;
boolean canBeAdded = false;
if((sub.charAt(0) != str.charAt(0) && sub.substring(1).equals(str.substring(1)))) {
canBeAdded = true;
toBeChanged = i;
}
else if (sub.charAt(0) == str.charAt(0) && sub.charAt(1) == str.charAt(1) && sub.charAt(2) != str.charAt(2)) {
canBeAdded = true;
toBeChanged = i+1;
}
else if(sub.charAt(0) == str.charAt(0) && sub.charAt(1) != str.charAt(1) && sub.charAt(2) == str.charAt(2)) {
canBeAdded = true;
toBeChanged = i+2;
}
if(s.substring(Math.max(0, toBeChanged-2), Math.min(n-1, toBeChanged+4)).indexOf(str) >= 0) {
affectsPrev = true;
}
if(!affectsPrev && canBeAdded) {
initCounts.put(str, initCounts.getOrDefault(str, 0) + 1);
if(initCounts.get(str) >= f) {
ans.add(str);
}
}
}
}
}
else if(f == 1) {
for(int i=1; i<n-1; i++) {
if(s.charAt(i) == s.charAt(i+1)) {
for(String let : letters) {
if(!let.equals(s.substring(i, i+1))) {
ans.add(let + "" + s.substring(i, i+2));
}
}
}
}
}
ArrayList<String> res = new ArrayList<String>(ans);
pw.println(res.size());
for(int i=0; i<res.size(); i++) {
pw.println(res.get(i));
}
pw.close();
}
}