spoj The Next Palindrome
题意:比给出的数大的最小回文数。
先用前n/2长对称到后面,如果没变大,在中间加1,进位,再对称。
//#pragma comment(linker,"/STACK:1024000000,1024000000") #include<iostream> #include<cstdio> #include<string> #include<cstring> #include<vector> #include<cmath> #include<queue> #include<stack> #include<map> #include<set> #include<algorithm> #include <stack> using namespace std; typedef long long lon; const lon SZ=1000010,INF=0x7FFFFFFF; void work(string &str) { int bs=0; for(int i=0;i<str.size()/2;++i) { if(str[i]>str[str.size()-1-i])bs=1; else if(str[i]<str[str.size()-1-i])bs=-1; str[str.size()-1-i]=str[i]; } if(bs<=0) { int c=0; str[(str.size()-1)/2]+=1; for(int i=(str.size()-1)/2;i>=0;--i) { str[i]+=c; if(str[i]>'9')str[i]='0',c=1; else c=0; } if(c) { str="1"+str; } for(int i=0;i<str.size()/2;++i) { str[str.size()-1-i]=str[i]; } } } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","w",stdout); lon casenum; cin>>casenum; for(lon time=1;time<=casenum;++time) //for(;scanf("%d",&n)!=EOF;) { string str; cin>>str; work(str); cout<<str<<endl; } return 0; }
浙公网安备 33010602011771号