제출 #1008179

#제출 시각아이디문제언어결과실행 시간메모리
1008179ezzzayPalindrome-Free Numbers (BOI13_numbers)C++14
100 / 100
741 ms512 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define ss second
#define pb push_back
int find(int n){
    if(n<=0)return n;
    string s= to_string(n);
    
    int N=s.size();
    int dp[20][10][10][2];
    for(int i=0;i<20;i++){
        for(int j=0;j<10;j++){
            for(int p=0;p<10;p++){
                for(int z=0;z<2;z++)dp[i][j][p][z]=0;
            }
            
        }
    }
    
    for(int i=1;i<10;i++){
        for(int j=0;j<10;j++){
            if(i>s[0]-'0')break;
            if(i==j)continue;
            if(i==s[0]-'0' and j==s[1]-'0'){
                dp[1][i][j][1]+=1;
                break;
            }
            dp[1][i][j][0]++;
        }
    }
    for(int i=2;i<N;i++){
        for(int j=0;j<10;j++){
            for(int p=0;p<10;p++){
                for(int k=0;k<10;k++){
                    for(int z=0;z<2;z++){
                       if(z==1 and k> s[i]-'0')continue;
                       if(k!=p and j!=k)dp[i][p][k][z and (s[i]-'0'==k)]+=dp[i-1][j][p][z];
                    }
                }
            }
        }
    }
    int ans=0;
    for(int i=0;i<10;i++){
        for(int j=0;j<10;j++){
            for(int z=0;z<2;z++){
                ans+=dp[N-1][i][j][z];
            }
        }
    }
    
    return ans;
    
}
int fun(int n){
    int k=0;
    int g= to_string(n).size();
    while(n>0){
        k+=find(n);
        //cout<<n<<" "<<endl;
        g--;
        n=0;
        for(int i=0;i<g;i++){
            n*=10;
            n+=9;
        }
    }
    return k;
}
bool check(string s){
    for(int i=0;i<s.size()-1;i++){
        if(s[i]==s[i+1]){
            return 0;
        }
    }
    for(int i=0;i<s.size()-2;i++){
        if(s[i]==s[i+2]){
            return 0;
        }
    }
    return 1;
}
void sbtsk(int a, int b){
    int ans=0;
    for(int i=a; i<=b; i++) {
        bool ok = 1;
        string s = to_string(i);
        for(int j=0; j+1<s.size(); j++) {
            if(s[j] == s[j+1]) ok = 0;
            if(j+2 < s.size() && s[j] == s[j+2]) ok = 0;
        }
        ans += ok;
    }
    cout<<ans;
    return;
    int t=0;
    for(int i=a;i<=b;i++){
        if(check(to_string(i))){
            t++;
        }
    }
    cout<<t;
}
signed main(){
    int a,b;
    cin>>a>>b;
    if(b-a<=5e7){
        sbtsk(a,b);
        return 0;
    }
    cout<<fun(b)-fun(a-1);
}

컴파일 시 표준 에러 (stderr) 메시지

numbers.cpp: In function 'bool check(std::string)':
numbers.cpp:72:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |     for(int i=0;i<s.size()-1;i++){
      |                 ~^~~~~~~~~~~
numbers.cpp:77:18: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |     for(int i=0;i<s.size()-2;i++){
      |                 ~^~~~~~~~~~~
numbers.cpp: In function 'void sbtsk(long long int, long long int)':
numbers.cpp:89:25: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |         for(int j=0; j+1<s.size(); j++) {
      |                      ~~~^~~~~~~~~
numbers.cpp:91:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |             if(j+2 < s.size() && s[j] == s[j+2]) ok = 0;
      |                ~~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...