原来,原来,这句漏掉了“the left of the leftmost alphanumeric” (z)的后继是(aa)
o(╯□╰)o 细心很重要。
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
bool alph(char str[])
{
int len=strlen(str),i;
for(i=0;i<len;i++){
if('0'<=str[i]&&str[i]<='9') return false;
if('a'<=str[i]&&str[i]<='z') return false;
if('A'<=str[i]&&str[i]<='Z') return false;
}
return true;
}
bool IS(char a)
{
if('0'<=a&&a<='9') return true;
if('a'<=a&&a<='z') return true;
if('A'<=a&&a<='Z') return true;
return false;
}
int fg(char a)
{
if(a=='9') return 1;
if(a=='z') return 2;
if(a=='Z') return 3;
return 0;
}
void add(char ans[])
{
if(alph(ans)) { ans[0]=ans[0]+1; return ;}
int i=0,len=strlen(ans);
while(!IS(ans[i])){
i++;
}
int k=fg(ans[i]);
if(k>0){
while(k){
if(k==1) ans[i++]='0';
if(k==2) ans[i++]='a';
if(k==3) ans[i++]='A';
while(i<len&&!IS(ans[i])) i++;//滤掉非字母
if(i>=len) break;
k=fg(ans[i]);
if(k==0) ans[i++]++;
}
}
else {
ans[i]++;
return ;
}
if(k>0){
int posi;
for(int j=len-1;j>=0;j--)
if(IS(ans[j])) {
posi=j; break;
}
for(int j=len;j>posi;j--)
ans[j]=ans[j-1];
if(k==1) ans[posi+1]='1';
if(k==2) ans[posi+1]='a';
if(k==3) ans[posi+1]='A';
ans[len+1]='\0';
}
}
void print(char ans[])
{
int len=strlen(ans);
for(int i=len-1;i>=0;i--) printf("%c",ans[i]);
printf("\n");
}
int main()
{
int CA;
cin>>CA;
while(CA--){
char str[120],ans[500];
int n,i,j;
scanf("%s %d",str,&n);
int len=strlen(str);
for(j=0,i=len-1;i>=0;i--)
ans[j++]=str[i];
ans[j]='\0';
for(i=0;i<n;i++){
add(ans);
print(ans);
}
printf("\n");
}
return 0;
}