반으로 잘라서 정렬을 한 후, 인접한 두 문자열의 겹치는 접두사의 길이만큼 트라이에서 정점이 감소하는 것이므로 n * k에서 길이만큼을 빼주면 된다
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n,m,k;
vector<string> s;
vector<string> e;
int cmp(string a, string b,string c, string d){
int i = 0, j = 0;
if(a == b) i = k;
else while(a[i] == b[i]) ++i;
if(c == d) j = k;
else while(c[j] == d[j]) ++j;
return i + j;
}
int main()
{
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k;
for(int i = 0; i < n; i++){
string str; cin>>str;
s.push_back(str.substr(0,k));
string t = str.substr(k,2*k);
reverse(t.begin(), t.end());
e.push_back(t);
}
int ans = n * k * 2;
sort(s.begin(),s.end());
sort(e.begin(),e.end());
for(int i = 1; i < n; i++) ans -= cmp(s[i-1],s[i],e[i-1],e[i]);
cout<<ans;
return 0;
}
'algorithm' 카테고리의 다른 글
[BOJ] 2467용액 (0) | 2022.08.27 |
---|---|
dp연습1 (0) | 2022.08.24 |
[BOJ] 20412 추첨상 사수 대작전 (0) | 2022.08.12 |
[BOJ] 9938 방청소 (0) | 2022.08.05 |
유클리드 호제법, 모듈로 역원 (0) | 2022.08.03 |