SPOJ PALIN - The Next Palindrome(贪心)

题意:给一个数 x(不含前导0),长度不超过1e6,要求找到最小且大于x的数,满足 x 表示成字符串是一个回文串。

比如99 -> 101,808 -> 818, 2133 ->2222

解法:要求大于 x,不妨先将 x = x + 1。。要求回文,且最小,不妨设两指针,分别指向需要回文的两个位置,起初t1 = 0, t2 = lens - 1,如果s[t1] >= s[t2],说明t2位置不需要进位就可以加到s[t1],使得这两个位置相等,然后t1++, t2–,看下一个对;如果s[t1] < s[t2],不妨将s[t2]加过进位,即加到9,再加变为0,然后将左边的数不断向左进位,如果影响到的左边的数比t1还要”左”,就改动t1,t2的值(往回移),否则将s[t2] = s[t1],t1++,t2–。。可以证明复杂度是O(N)的。

Code

//Hello. I'm Peter.
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<functional>
#include<stack>
using namespace std;
typedef long long ll;

#define MAXN 1000010
char s[MAXN];
int lens;

void add(char *s, int& lens){
    bool alln = 1;
    for(int i = 0; i < lens && alln == 1; i++) if(s[i] != '9') alln = 0;
    if(alln){
        lens++;
        for(int i = 0; i < lens; i++) s[i] = '0';
        s[0] = '1';
    }
    else{
        for(int i = lens - 1; i >= 0; i--){
            if(s[i] == '9') s[i] = '0';
            else{
                s[i]++;
                break;
            }
        }
    }
}

int main(){
    int T;
    scanf("%d",&T);
    for(int kase = 1; kase <= T; kase++){
        scanf("%s",s);
        lens = (int)strlen(s);
        add(s, lens);

        int t1 = 0, t2 = lens - 1;
        while(t1 <= t2){
            if(s[t1] >= s[t2]) s[t2] = s[t1];
            else{
                s[t2] = '0';
                int i = t2 - 1;
                for(; i >= 0; i--){
                    if(s[i] == '9') s[i] = '0';
                    else{
                        s[i]++;
                        break;
                    }
                }
                if(i < t1){
                    t1 = i;
                    t2 = lens - t1 - 1;
                    continue;
                }
                else s[t2] = s[t1];
            }
            t1++, t2--;
        }
        s[lens] = '\0';
        printf("%s\n",s);
    }
    return 0;
}

你可能感兴趣的:(SPOJ PALIN - The Next Palindrome(贪心))