문자열 - 아호 코라식(Aho-Corasick)
아호 코라식(Aho-Corasick)에 대해 알아보자.
+97점, -10점 했다.
그래도 긍정적인 부분은 이제 코포 유형이 뭔지 감이 잡히고 있다.
코포는 코포로 공부하는게 맞는것같다.
그래도 버추얼은 귀찮아서 안하지만 ㅋㅋㅋ
div 4는 다 풀어야하는데 정말 슬프다.. 빨리 더 수련을 해야겠다.
div 3, div 4 둘다 4솔했고 틀린 문제만 업솔빙 해보려고 한다.
이때 당시 멀티셋에 빠져있던터라 멀티셋 썼는데 왜틀렸는지 당시에는 진짜 몰랐다.
끝나고 푼 사람들을 보니 싸이클이 있는지 확인해서 푼 사람들이 많았다.
에디토리얼은 맵을 이용했다.
맵을 이용한 풀이는 나랑 같았지만 여기서 추가적으로 결과적으론 사이클을 판별해야했다.
두 그룹으로 나눈다는게(Split into Two Sets) 그림으로 그려보면 고등학교 때 함수 개념 배울 때 사용하는 모양이 나오니까
Bipartite Graph(이분그래프)를 떠올리는 건 자연스럽다.
cin >> n;
for(int i=0;i<n;i++){
int num; cin >> num;
while (!(num&1)) num >>= 1;
m1.insert(num); //m1은 multiset이다.
}
multiset<int> :: iterator iter;
for(int i=0;i<n;i++){
int num; cin >> num;
iter = m1.find(num);
while (iter==m1.end()&&num!=1){
num >>=1;
iter = m1.find(num);
}
if(iter!=m1.end()) m1.erase(iter);
}
if(m1.empty()) cout<<"YES\n";
else cout << "NO\n";
m1.clear();
}
코포에 많이 나오는듯한 느낌의 문제였다.
관찰은 해봤지만 내가 생각한 방법에대한 시간복잡도 땜에 쫄아서 그런지 아무 생각이 안났다.
핵심은 »1 과 «1 밖에 안쓰니까 비트연산으로 접근해도 된다는 것이다.
그러면 같은 숫자가 될 수 있는 것은 비트연산에서 마지막 0들을 뗀 값일 것이다.
예를 들면, 3 = 11, 24 = 11000 이러면 3번 연산 필요하다는 것을 0세번 떼면서 알 수 있다.
그래서 첫번재 배열은 0들을 다 뗀 값을 넣어주고 두번쨰 배열을 입력받을 때 하나하나 쉬프트 연산 해주면서 있는 지없는지 확인한다.
귀찮아서 생략!
< algorithm >에 있는 find함수가 그냥 무지성으로 왼쪽에서부터 검사하는지 몰랐다.
그냥 이럴줄 알았으면 멀티셋으로 끝내버리는건데…하..substr으로 문자열 잘 나눠서 푸는건 잘했지만…..
많이 배웠다..
멀티셋으로 하면 문제점이 크기 순으로 정렬하니까 idx를 관리 할때 힘들다.
그래서 algorithm을 건드렸지만 잘모르고 건드리면 안된다는 걸 확실히 배웠다.
이건 문제 이름이 왜케 긴건지 ㅋㅋㅋ 해석이 잘 안된다.
이분탐색의 직관은 잡을 수 있었는데 못풀었다. ㅎㅎ
이분탐색 문제들은 다 넘 어려웡 ㅠㅠ
arr[i]>i를 이용해서 arr[i] < i ,arr[j] < j 를 다 해결하는 것이 인상깊었다.
vector<int> arr;
int main(){
fast_io;
int test; cin >> test;
while (test--) {
int n; cin >> n;
arr = vector<int> (n+1);
for(int i=1;i<=n;i++) cin >> arr[i];
vector<int> v;
ll res =0;
for(int i =1;i<=n;i++){
if(arr[i]>=i) continue; //i, j 둘다 거름
res += (ll)(lower_bound(v.begin(), v.end(), arr[i])-v.begin()); //arr[j]보다 작은 i의 개수 세기
v.push_back(i);
}
cout << res << '\n';
}
}
F같은 유형에서 도망가서 사실 G를 더 많이 봤다.
솔직히 그리디라는 걸 눈치채지 못했다.
Bad key가 이름만 들어도 좀 쓰면 안좋을 것 같은 기분이긴 했는데 ㅋㅋㅋ
나의 감각에 어느정도 기대도 될 것 같기도 했다.
결론은 Good Key를 앞에서 몰아서 쓰는게 이득이라는 것이다.
Bad key를 사용해야 하는 개수는 정해져 있고 good key를 앞에서 몰아서 쓰자는 것이다.
ll res=0, sum=0; //sum은 goodkey를 앞에서 쓰는 것이다.
for(int i=0;i<=n;i++){
ll now = sum;
for(int j=i+1;j<=min(n, 32+i);j++){ //bad키를 쓰는 모든 경우를 check
ll copy = arr[j]; //bad key를 32번 넘게 쓰면 10^9을 0으로 만들고 더 줄이는 꼴이라 의미가 없음
copy >>= j-i; // i=0 -> bad키를 n번씀, i=n -> bad키를 안씀
now += copy;
}
res = max(res, now);
if(i==n) continue;
sum += arr[i+1]-k;
}
cout << res << '\n';
아호 코라식(Aho-Corasick)에 대해 알아보자.
docker를 이해해보자
2060 염소줄서기 풀이 및 코드
분할정복을 이용한 다이나믹 프로그래밍 최적화
코드포스 다시 열심히! 블로그도 열심히!
rust 공부시작!
코드포스 블루 달성 후기
여름캠프 및 SUAPC 후기
2023-05-25-Edu Codeforce round 149 (Div.2)
2023-05-13-Edu Codeforce round 148 (Div.2)
HLD(Heavy Light Decomposition)
행렬 거듭 제곱
2023-05-02-It takes two
Codeforce round 868 (Div.2)
2월 11일 문제풀이
Codeforces#846, TypeDB Foreces 2023, Codeforces#848 업솔빙
ps5 게임 : 용과같이 제로 리뷰
백준 23877번 Convoluted Intervals 문제풀이
codeforce round #828(div 3), EDU #137(div 2) 업솔빙
codeforce round #823(div 2), #824(div 2) 업솔빙
AtCoder Beginner Contest 270 업솔빙
ps5 게임 : 용과같이 극 1 리뷰
백준 18719번 Binomal 문제풀이
백준 14288번 회사문화4 문제풀이
백준 3308번 Matching 문제풀이
백준 18186번 라면사기(large) 문제풀이
백준 4196번 도미노 문제풀이
백준 3176번 도로 네트워크 문제풀이
백준 16367번 TV Show Game 문제풀이
ps5 게임 : 페르소나 5 더 로열 리뷰
codeforce round #811(div 3), #812(div 2), CodeTon round 2 업솔빙
백준 21162번 뒤집기 K 문제풀이
codeforce round #808(div 2), #803(div 2, virtual) 업솔빙
codeforce round #807(div 2) 업솔빙
백준 10167번 금광 문제풀이
codeforce round #805(div 3), #806(div 4) 업솔빙
백준 18253번 최단경로와 쿼리 문제풀이
에듀 라운드 131 업솔빙
백준 1949번 우수 마을 문제풀이
백준 3665번 최종 순위 문제풀이
Trie 자료구조 이해하기
merge sort를 이용하여 inversion 개수세기
3솔의 벽이 너무 높다..
lazy propagation없이 구간 갱신하기
코드포스 폭망기념 upsolving
백준 11505 구간 곱 구하기 문제풀이
백준 1305 광고 문제풀이
백준 4386 별자리 만들기 문제풀이
백준 4803 트리
백준 2206 벽 부수고 이동하기 문제풀이
백준 2166 다각형의 면적 문제풀이
백준 12015 가장 긴 증가하는 부분 수열2 문제풀이
백준 10986 나머지합 문제풀이
스택 구현하기 ========== 자료구조의 기본이라고 하면 스택 과 큐가 있다 백준 10828번에서 마주친 스택
매우매우 많은 정렬이 있지만 그중 가장 안 어려운 3가지를 공부해보았다.
Leave a comment