문자열 - 아호 코라식(Aho-Corasick)
아호 코라식(Aho-Corasick)에 대해 알아보자.
하… 진짜 미칠 것 같다 이번엔 A, B를 20분 만에 풀어서 2시간동안 한 문제만 풀어도 3솔의 벽을 깨는 건데…
그걸 못했다. 2시간동안 C,D하나 풀기를…ㅠㅠ
이쯤 되면 이번 방학 목표를 코드포스 3솔로 바꿔야 할 것 같다.(원래 블루였음ㅋㅋ)
내 생각보다 블루, 퍼플이 엄청 대단한 사람들이란걸 몸소 느낀다.
정렬하고 반 나눠서 연산하면 바로 끝이다.
근데 n이 주어지고 n/2가 주어지는게 아니라 이미 절반을 한 값을 준다는 특징이 있었다.
그래서 좀 어버버하다가 5분에 AC
int n, x; cin >> n >> x;
vector<int> height(2*n+1);
for(int i=1;i<=2*n;i++) cin >> height[i];
sort(height.begin(), height.end());
bool possible = true;
for(int i=1;i<=n;i++){
if(height[i+n]-height[i]<x) possible = false;
}
if(possible) cout << "YES\n";
else cout << "NO\n";
이 문제까진 꽤 느낌이 좋았다.
왜냐면 내가봐도 좀 잘풀었기 때문이다.
먼지를 뒤로 모는 문제고 0이 중간에 껴있는경우 턴을 좀 더 써야한다.
그래서 스위핑으로 끝점 빼고 먼지+추가적인 턴을 더해서 단 3줄로 끝냈다.
int n; cin >>n;
rooms = vector<ll> (n+1);
ll res = 0;
for(int i=1;i<=n;i++){
cin >> rooms[i];
if(i!=n) res += rooms[i];
if(!rooms[i]&&res&&i!=n) res++;
}
cout << res << '\n';
마크한테 실망했다. substr문제인가 하고 보니 쿼리의 범위가 long long형까지 갔다..
당연히 메모리 초과 날걸 알았지만 해봤고 역시 메모리 초과가 났다.
그렇다면 연산으로 역추적? 을 해야하는데 그게 생각이 1도 안났다.
string이 계속 바뀌는데 어케 역추적을 해야하지..라는 생각을 하다가 시간 다쓰고 망했다.
첫 글자랑 위치만 저장해볼까 했는데 그게 string이 바뀌니깐 너무 곤란했다. ㅠㅠ
에디토리얼 보니 비슷하다..다만 왼쪽 오른쪽 복사된 idx만 저장하는게 아니라 diff라는 이름의 배열로 왼쪽 시작점-왼쪽 쿼리시작점을 뺀것을 저장한다.
이것의 의미는 바로 이전 시작점인것이다.
왜 이걸 못했을까…?
솔직히 좀 좋은 문제였다.
for(int i=0;i<q;i++){
ll k; cin >> k;
k--;
for(ll j=c;j>=1;j--){
if(k<left[j]) continue;
k -= diff[j];
}
cout << str[k] << '\n';
}
C보다 이게 더 나을 것 같아서 꽤 오래 본 문제이지만 어..이건가?? 하는데 반례가 계속 나왔다 ㅠㅠ
일단 하나의 전구를 바꿀 수 있어서 그걸 바꾸면 그 양옆의 상태가 변한다는 특징이 있었다.
이런 식으로 계산 할 수 있다는 것이다.
ll n, c,q;
int main(){
fast_io;
int test; cin >> test;
while (test--) {
int n; cin >> n;
string s1, s2;
cin >> s1 >> s2;
bool ok = true;
if(s1[0]!=s2[0]||s1[n-1]!=s2[n-1]) ok = false;
vector<int> pos1, pos2;
for(int i=0;i<n-1;i++){
if(s1[i]!=s1[i+1]) pos1.push_back(i);
if(s2[i]!=s2[i+1]) pos2.push_back(i);
}
if(pos1.size()!=pos2.size()) ok = false;
if(ok){
ll res = 0;
for(int i=0;i<pos1.size();i++){
res += abs(pos1[i]-pos2[i]);
}
cout << res << '\n';
}else{
cout << -1 << '\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