1
+ #include < iostream>
2
+ #include < vector>
3
+ #include < algorithm>
4
+ #include < queue>
5
+ #include < string>
6
+ #include < map>
7
+ #include < set>
8
+
9
+ #define MAXSIZE 2010
10
+ #define MAX 100000000
11
+
12
+ using namespace std ;
13
+
14
+ struct FlowGraph {
15
+ struct Edge {
16
+ int idx;
17
+ int start, end, capacity;
18
+ };
19
+
20
+ vector<Edge> E;
21
+ vector<int > V[MAXSIZE];
22
+ int source, sink, level[MAXSIZE], start[MAXSIZE];
23
+
24
+ void clear ()
25
+ {
26
+ E.clear ();
27
+ for (int i = 0 ; i < MAXSIZE; i++)
28
+ {
29
+ V[i].clear ();
30
+ start[i] = 0 ;
31
+ }
32
+ }
33
+
34
+ void setEdge (int u, int v, int c) {
35
+ int n = E.size ();
36
+
37
+ E.push_back ({n, u, v, c});
38
+ E.push_back ({n + 1 , v, u, 0 });
39
+
40
+ V[u].push_back (n);
41
+ V[v].push_back (n + 1 );
42
+ }
43
+
44
+ void levelGraph () {
45
+ queue<int > q;
46
+ for (int i = 0 ; i < MAXSIZE; i++) level[i] = -1 ;
47
+
48
+ level[source] = 0 ;
49
+ q.push (source);
50
+
51
+ while (!q.empty ()) {
52
+ int here = q.front (); q.pop ();
53
+
54
+ for (auto edge : V[here]) {
55
+ int next = E[edge].end ;
56
+ if (level[next] == -1 && E[edge].capacity ) {
57
+ level[next] = level[here] + 1 ;
58
+ q.push (next);
59
+ }
60
+ }
61
+ }
62
+ }
63
+
64
+ long long dfs (int u, int minFlow = MAX) {
65
+ if (u == sink) return minFlow;
66
+
67
+ for (; start[u] < V[u].size (); start[u]++) {
68
+ auto edge = E[V[u][start[u]]];
69
+ int next = edge.end ;
70
+
71
+ if (level[next] == level[u] + 1 && edge.capacity ) {
72
+ long long f = dfs (next, min (minFlow, edge.capacity ));
73
+ if (f) {
74
+ E[edge.idx ].capacity -= f;
75
+ E[edge.idx ^ 1 ].capacity += f;
76
+ return f;
77
+ }
78
+ }
79
+ }
80
+
81
+ return 0 ;
82
+ }
83
+
84
+ long long maxflow () {
85
+ long long ret = 0 ;
86
+ while (1 ) {
87
+ levelGraph ();
88
+ if (level[sink] == -1 ) break ;
89
+ for (int i = 0 ; i < MAXSIZE; i++) start[i] = 0 ;
90
+ while (1 ) {
91
+ long long flow = dfs (source);
92
+ if (flow == 0 ) break ;
93
+ ret += flow;
94
+ }
95
+ }
96
+
97
+ return ret;
98
+ }
99
+ } G;
100
+
101
+ map<string, set<int > > m;
102
+ int n;
103
+
104
+ void longestSuffix (string& s1, string& s2, string& ret)
105
+ {
106
+ ret = " " ;
107
+ int start1 = s1.size () - 1 , start2 = s2.size () - 1 ;
108
+ for (; start1 >= 0 && start2 >= 0 && s1[start1] == s2[start2]; start1--, start2--)
109
+ {
110
+ ret += s1[start1];
111
+ }
112
+
113
+ reverse (ret.begin (), ret.end ());
114
+ }
115
+
116
+ int main ()
117
+ {
118
+ ios::sync_with_stdio (false );
119
+ cin.tie (NULL );
120
+
121
+ int t = 1 , T;
122
+ for (cin >> T; t <= T; t++)
123
+ {
124
+ int idx;
125
+
126
+ cout << " Case #" << t << " : " ;
127
+ m.clear ();
128
+ G.clear ();
129
+
130
+ cin >> n;
131
+
132
+ vector<string> ss = vector<string>(n + 1 );
133
+ G.source = 0 ;
134
+
135
+ for (int i = 0 ; i < n; i++)
136
+ {
137
+ cin >> ss[i + 1 ];
138
+ G.setEdge (G.source , i + 1 , 1 );
139
+ }
140
+
141
+ string s;
142
+ for (int i = 1 ; i <= n; i++)
143
+ {
144
+ for (int j = i + 1 ; j <= n; j++)
145
+ {
146
+ longestSuffix (ss[i], ss[j], s);
147
+ if (s != " " )
148
+ {
149
+ m[s].insert (i);
150
+ m[s].insert (j);
151
+ }
152
+ }
153
+ }
154
+
155
+ G.sink = n + m.size () + 1 ;
156
+ idx = n + 1 ;
157
+
158
+ for (auto p : m)
159
+ {
160
+ for (int ele : p.second )
161
+ {
162
+ G.setEdge (ele, idx, 1 );
163
+ }
164
+
165
+ G.setEdge (idx, G.sink , 2 );
166
+ idx++;
167
+ }
168
+
169
+ cout << G.maxflow () << ' \n ' ;
170
+ }
171
+ }
0 commit comments