본문 바로가기

Problem Solving/문제풀이

[BOJ] 10840 구간 성분

진짜 어이없게 풀었다. 처음에는 해싱인지 모르고 $O(n^3)$에 최적화 생각했는데

롤링 해시 구현하기 귀찮아서 그냥 알파벳에 숫자 하나씩 할당해 놓고 다 더한다음에 일치하면 okay라고 판별했다.

int 범위 내에서 하니까 충돌나길래 long long 범위까지 늘렸더니 어셉됐다 ㅋㅋㅋㅋㅋㅋ

결과적으로는 $O(n^2 lg n) 풀이임.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cassert>
 
using namespace std;
 
typedef long long ll;
 
ll prime[]={1553543355441,6835413543356,341238467843,5846878493734,255654493854,4385646055553,29333247254,56842665466513,6562454444132,33264680204,97185465094454,8937264644356,85143166465423,78565446465415,98746146556215,8547654654856,841537879874131,7293864657254,9814378779242,74464658844594,24495564314761,186549524066569,39665654465873,481654731322,41565458484,13646542908};
 
int ctoi(char x)
{
    return x-'a';
}
 
int main()
{
    char a[1505],b[1505];
    scanf("%s %s",a,b);
    int alen=strlen(a);
    int blen=strlen(b);
 
    /*for(int i=0;i<26;i++)
        assert(isPrime(prime[i]));*/
 
    ll asum[1505]={},bsum[1505]={};
    for(int i=1;i<=alen;i++)
        asum[i]=asum[i-1]+prime[ctoi(a[i-1])];
    for(int i=1;i<=blen;i++)
        bsum[i]=bsum[i-1]+prime[ctoi(b[i-1])];
    vector<ll> V;
    for(int i=1;i<=alen;i++)
        for(int j=i;j<=alen;j++)
            V.push_back(asum[j]-asum[i-1]);
    sort(V.begin(),V.end());
    for(int i=blen;i>=1;i--)
    {
        for(int j=0;j<=blen-i;j++)
        {
            if(binary_search(V.begin(),V.end(),bsum[i+j]-bsum[j]))
            {
                printf("%d",i);
                return 0;
            }
        }
    }
    printf("0");
    return 0;
}
 
cs

'Problem Solving > 문제풀이' 카테고리의 다른 글

[BOJ] 2629 양팔저울  (0) 2018.09.06
NYPC 예선 후기  (1) 2018.08.31
[BOJ] 2472 체인점  (0) 2018.07.18
[CF] Codeforces Round #464 (Div. 2)  (0) 2018.02.18
[BOJ] 1504 특정한 최단 경로  (0) 2018.02.12