1 #include <iostream>
2 #include <vector>
3 #include <string>
4 #include <map>
5 using namespace std;
6 int m,n;
7 vector<int> warMap;
8
9 map<int,int> LineStatus;
10 int EndData;
11 struct KeyVal
12 {
13 int key;
14 int val;
15 public:
16 KeyVal(int k,int v):key(k),val(v)
17 {
18
19 }
20 };
21 struct KeyVec
22 {
23 int key;
24 vector<KeyVal> val;
25 public:
26 KeyVec(int k):key(k)
27 {
28
29 }
30 KeyVec(int k,vector<KeyVal>& v):key(k),val(v)
31 {
32
33 }
34 };
35 typedef vector<KeyVec> PreStatus;
36 typedef vector<KeyVal> ST;
37 int GetNum(int val)
38 {
39 int result=0;
40 for (int i=0;i<m;++i)
41 {
42 result+=(val>>i)&1;
43 }
44 return result;
45 }
46
47 bool check(int val)
48 {
49 if ((val&(val>>2))||(val&(val>>1)))
50 {
51 return false;
52 }
53 else
54 {
55 return true;
56 }
57 }
58 void GetLine(int val,int step,map<int,int>& result)
59 {
60 if (step>=m)
61 {
62 result.insert(make_pair(val,GetNum(val)));
63 }
64 else
65 {
66 int tmp=val|(1<<step);
67 if (check(tmp))
68 {
69 GetLine(tmp,step+1,result);
70 }
71 GetLine(val,step+1,result);
72 }
73 }
74 void GetUsefulStatus(int i,ST& UsefulStatus)
75 {
76 for (map<int,int>::iterator iter=LineStatus.begin();iter!=LineStatus.end();++iter)
77 {
78 if (!((iter->first)&warMap[i]))
79 {
80 UsefulStatus.push_back(KeyVal(iter->first,iter->second));
81 }
82 }
83 }
84
85 void DP(int step,PreStatus& p)
86 {
87 if (step>=n)
88 {
89 for (PreStatus::iterator iter=p.begin();iter!=p.end();++iter)
90 {
91 for (ST::iterator it2=iter->val.begin();it2!=iter->val.end();++it2)
92 {
93 if (it2->val>EndData)
94 {
95 EndData=it2->val;
96 }
97 }
98 }
99 }
100 else
101 {
102 ST ussta;
103 GetUsefulStatus(step,ussta);
104 PreStatus p2;
105 p2.reserve(60);
106 for (ST::iterator iter=ussta.begin();iter!=ussta.end();++iter)
107 {
108 ST pre;
109 pre.reserve(60);
110 for (PreStatus::iterator itP1=p.begin();itP1!=p.end();++itP1)
111 {
112 if (iter->key&itP1->key)
113 {
114 continue;
115 }
116 int num=0;
117
118 for (ST::iterator itP2=itP1->val.begin();itP2!=itP1->val.end();++itP2)
119 {
120 if ((!(iter->key&itP2->key))&&(itP2->val>num))
121 {
122 num=itP2->val;
123 }
124 }
125 pre.push_back(KeyVal(itP1->key,iter->val+num));
126 }
127 if (pre.size()>0)
128 {
129 p2.push_back(KeyVec(iter->key,pre));
130 }
131 }
132 DP(step+1,p2);
133 }
134 }
135 int main()
136 {
137 cin>>n>>m;
138 for (int i=0;i<n;++i)
139 {
140 string tmp;
141 cin>>tmp;
142 int res=0;
143 for (int j=0;j<tmp.size();++j)
144 {
145 if (tmp[j]-'H'==0)
146 {
147 res=res|(1<<j);
148 }
149 }
150 warMap.push_back(res);
151 }
152 GetLine(0,0,LineStatus);
153 PreStatus pre;
154 KeyVal ppre(0,0);
155 KeyVec kv(0);
156 kv.val.push_back(ppre);
157 pre.push_back(kv);
158 DP(0,pre);
159 cout<<EndData<<endl;
160 }