제출 #3697

#제출 시각아이디문제언어결과실행 시간메모리
3697pichuliaMake superpalindrome! (kriii1_M)C++98
1 / 1
0 ms1184 KiB
#include<stdio.h>
#include<string.h>

int n;
char a[100005];

bool checksuper(int st,int en){
	int i;
	if(st==en)
		return true;
	for(i=st;i<=en;i++)
		if(a[i]!=a[en-i+st])
			return false;
	if((en-st+1)%2==0)
		return checksuper(st,(en+st)/2)&&checksuper((en+st)/2+1,en);
	return checksuper(st,(en+st-1)/2)&&checksuper((en+st-1)/2+2,en);
}

void makesuper(int st,int en){
	int i;
	bool ch=true;
	if(checksuper(st,en))
		return;
	if(checksuper(st,(st+en-1)/2)){
		if((en-st+1)%2==0){
			for(i=(st+en)/2+1;i<=en;i++){
				if(a[i]<a[en-i+st]){
					ch=true;
					break;
				}
				else if(a[i]>a[en-i+st]){
					ch=false;
					break;
				}
			}
			if(ch){
				for(i=(st+en)/2+1;i<=en;i++)
					a[i]=a[en-i+st];
			}
			else{
				for(i=(st+en)/2;i>=st;--i)
					if(a[i]!='z'){
						a[i]++;
						break;
					}
				makesuper(st,(st+en)/2);
				for(i=(st+en)/2+1;i<=en;i++)
					a[i]=a[en-i+st];
			}
		}
		else{
			for(i=(st+en-1)/2+2;i<=en;i++){
				if(a[i]<a[en-i+st]){
					ch=true;
					break;
				}
				else if(a[i]>a[en-i+st]){
					ch=false;
					break;
				}
			}
			if(ch){
				for(i=(st+en-1)/2+2;i<=en;i++)
					a[i]=a[en-i+st];
			}
			else{
				if(a[(st+en-1)/2+1]!='z')
					a[(st+en-1)/2+1]++;
				else{
					for(i=(st+en-1)/2;i>=st;--i)
						if(a[i]!='z'){
							a[i]++;
							break;
						}
					makesuper(st,(st+en-1)/2);
					a[(st+en-1)/2+1]='a';
				}
				for(i=(st+en-1)/2+2;i<=en;i++)
					a[i]=a[en-i+st];
			}
		}
	}
	else{
		if((en-st+1)%2==0){
			makesuper(st,(st+en)/2);
			for(i=en;i>=(st+en)/2+1;--i)
				a[i]=a[en-i+st];
		}
		else{
			makesuper(st,(st+en-1)/2);
			for(i=en;i>=(st+en-1)/2+2;--i)
				a[i]=a[en-i+st];
			a[(st+en-1)/2+1]='a';
		}
	}
}

int main(){
	scanf("%s",&a[1]);
	n=strlen(&a[1]);
	makesuper(1,n);
	printf("%s",&a[1]);
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...