int main()
{
string input;
while(getline(cin,input))
{
int size=input.size()-1;
int count=0;
while(input[size]!=' '&&size>=0)
{
size--;
count++;
}
cout<return 0;
}
int main()
{
string input;
while(getline(cin,input))
{
stringstream ss(input);
string word;
while(ss>>word)
;
cout<size();
}
return 0;
}
int main()
{
string input;
getline(cin,input);
map<char,int> index;
char ch;
cin>>ch;
for(int i=0;iint res=index[toupper(ch)]+index[tolower(ch)];
cout<int numOfString(string s, char target);
int main()
{
string str;
int num;
char target;
getline(cin,str);
cin >> target;
num = numOfString(str, target);
cout << num << endl;
}
int numOfString(string s,char target) {
int res=0;
int len = s.size();
for (int i = 0; i < len; ++i)
{
if (s[i] == tolower(target) || s[i] == toupper(target))
++res;
}
return res;
}
void QuickSort(vector<int>& vec,int low,int high);
int Partition(vector<int>& vec, int low, int high);
vector<int> del(vector<int>& vec);
int main()
{
int n;
while( cin>>n){
int index=n;
vector<int> vec;
while(index--)
{
int num;
cin>>num;
vec.push_back(num);
}
QuickSort(vec,0,vec.size()-1);
vector<int> res;
res=del(vec);
//vector::iterator it=unique(vec.begin(),vec.end());
//vec.erase(it,vec.end());
for(int i=0;icout<return 0;
}
//去重
vector<int> del(vector<int>& vec)
{
vector<int> res;
vector<int>::iterator it=vec.begin();
res.push_back(*it);
int itR=0;
while(it!=(vec.end()-1))
{
if(*++it!=res[itR])
{
res.push_back(*it);
itR++;
}
}
return res;
}
//排序
void QuickSort(vector<int>& vec,int low,int high)
{
int pivot=0;
if (low < high)
{
pivot = Partition(vec,low,high);
QuickSort(vec, low, pivot-1);
QuickSort(vec, pivot+1, high);
}
}
int Partition(vector<int>& vec, int low, int high)
{
int pivotkey = vec[low];
while (low < high)
{
while (low < high&&vec[high]>=pivotkey)
high--;
if (low < high)
vec[low++] = vec[high];
while (low < high&&vec[low] <= pivotkey)
low++;
if (lowreturn low;
}
方法二:
void Solution(int num);
int main()
{
int count;
while(cin >> count)
Solution(count);
return 0;
}
void Solution(int num)
{
vector<int> rnd;
int opt;
for (int i = 0; i < num; ++i)
{
cin >> opt;
rnd.push_back(opt);
}
sort(rnd.begin(),rnd.end());
auto end = unique(rnd.begin(), rnd.end());
rnd.erase(end,rnd.end());
for (int i : rnd)
cout << i << endl;
}
void Sol(vector<string>& res,string in);
int main(){
string input1;
string input2;
getline(cin,input1);
getline(cin,input2);
vector<string> res;
Sol(res,input1);
Sol(res,input2);
for(int i=0;icout<void Sol(vector<string>& res,string in)
{
if(in.empty())
return;
if(in.size()<=8)
{
for(int i=in.size();i<8;i++)
in+='0';
res.push_back(in);
}
else{
int i=0;
while(istring word;
for(int index=0;index<8;index++)
{
if(i+indexelse
word+='0';
}
res.push_back(word);
i+=8;
}
}
}
#include
#include
#include
#include
#include
#include
using namespace std;
map<char,int> mapindex= {
{ '0', 0 },
{ '1', 1 },
{ '2', 2 },
{ '3', 3 },
{ '4', 4 },
{ '5', 5 },
{ '6', 6 },
{ '7', 7 },
{ '8', 8 },
{ '9', 9 },
{ 'a', 10 },
{ 'A', 10 },
{ 'b', 11 },
{ 'B', 11 },
{ 'C', 12 },
{ 'c', 12 },
{ 'd', 13 },
{ 'D', 13 },
{ 'E', 14 },
{ 'e', 14 },
{ 'f', 15 },
{ 'F', 15 }
};
int main()
{
string in;
while(cin>>in)
{
string result;
int res=0;
if(in.size()<3)
break;
if(in[0]!='0'||(in[1]!='x'&&in[1]=='X'))
break;
int index=2;
for(;index16+mapindex[in[index]];
stringstream ss;
ss<>result;
//注意要加endl,否则就会出错
cout<return 0;
}
string getResult(long ulDataInput)
{
long res=ulDataInput;
vector<int> vec;
//此处的循环条件要注意
for(int i=2;i<=res;++i)
{
while(res%i==0)
{
vec.push_back(i);
res/=i;
}
}
stringstream ss;
for(int i=0;i' ';
}
return ss.str();
}
int main(){
long in;
while(cin>>in){
cout<return 0;
}
int main()
{
float in;
while(cin>>in)
{
int res=in;
if((in-res)<0.5)
cout<else
cout<1;
}
return 0;
}
int main()
{
int num;
map<int,int> map;
cin>>num;
while(num--)
{
int index,key;
cin>>index>>key;
map[index]+=key;
}
for(auto i:map)
{
cout<" "<return 0;
}
#include
#include
#include
using namespace std;
long long noRepeat(long long in)
{
long long res=0;
vector<int> index;
index.clear();
while(in!=0)
{
int i=in%10;
if(find(index.begin(),index.end(),i)==index.end())
index.push_back(i);
in/=10;
}
for(int i=0;i10+index[i];
return res;
}
int main()
{
int in;
cin>>in;
cout<return 0;
}
#include
#include
using namespace std;
int number(string in)
{
set<char> index;
for(int i=0;ireturn index.size();
}
int main()
{
string in;
cin>>in;
cout<return 0;
}
#include
#include
#include
using namespace std;
int main()
{
long long in;
while(cin>>in){
vector<int> index;
for(int i=0;i10);
in/=10;
}
stringstream ss;
for(int i=0;icout<return 0;
}
#include
#include
#include
#include
using namespace std;
int main()
{
string in;
while(cin>>in){
string res;
for(int i=in.size()-1;i>=0;--i)
res+=in[i];
cout<return 0;
}
string reverse(string in)
{
string res;
if(in.empty())
return res;
stringstream ss(in);
string word;
vector<string> vec;
while(ss>>word)
vec.push_back(word);
for(int i=vec.size()-1;i>0;--i)
{
res+=vec[i];
res+=' ';
}
res+=vec[0];
return res;
}
int main()
{
string input;
while (getline(cin, input))
{
cout << reverse(input);
}
return 0;
}
#include
#include
#include
using namespace std;
int Partition(vector<string> &vec,int low,int high)
{
string index=vec[low];
while(lowwhile(lowif(lowwhile(low=vec[low])
low++;
if(lowreturn low;
}
void sort(vector<string> &vec,int low,int high)
{
int index=0;
while(low1);
//快排递归时做一下优化,减少递归时的栈空间
low=index+1;
}
}
int main()
{
int num;
while (cin >> num)
{
vector<string> res;
string tmp;
while (num)
{
cin >> tmp;
res.push_back(tmp);
--num;
}
sort(res,0,res.size()-1);
for(int i=0;icout<return 0;
}
/*
输入一个int型数据,计算出该int型数据在内存中存储时1的个数。
*/
#include
using namespace std;
unsigned Solution(int in)
{
//循环最高位1所在的位数次
unsigned count=0;
while(in!=0)
{
if(in&1)
count++;
in=in>>1;
}
return count;
}
int main()
{
int num;
while (cin >> num)
{
cout<return 0;
}
unsigned Solution(int in)
{
//循环int中1个数次
unsigned count=0;
while(in)
{
count++;
in=in&(in-1);
}
return count;
}
#include
#include
#include
using namespace std;
bool IsAllCharExist(string s1,string s2)
{
bool flag=true;
int len1=s1.size();
int len2=s2.size();
set<char> index;
for(int i=0;ifor(int j=0;jif(index.find(s1[j])==index.end())
{
flag=false;
break;
}
}
return flag;
}
int main()
{
string s1,s2;
while(cin>>s1)
{
cin>>s2;
if(IsAllCharExist(s1,s2))
cout<<"true"<else
cout<<"false"<
#include
#include
#include
using namespace std;
string maxString(string str1,string str2)
{
int len1=str1.size();
int len2=str2.size();
vector<int> tmp(len1,0);//存放前一行的结果
vector<int> cur(len1,0);//存放当前行的结果
int maxlen=0;//最长的公共子串长度
int pos=0;//标记最长公共子串最后的位置
for(int i=0;i//当前行清零
cur.assign(len1,0);
for(int j=0;jif(str2[i]==str1[j])
{
if(j==0)
cur[j]=1;
//若匹配,则当前行为前一行j-1位置处值+1;
else
cur[j]=tmp[j-1]+1;
}
//输出短字符串中最早出现的最长公共子串
if(cur[j]>maxlen)
{
maxlen=cur[j];
pos=j;
}
//最长的长度相同的情况,判断若在短字符串中出现的更早,更新位置标记
else if(maxlen==cur[j]&&jstring res=str1.substr(pos-maxlen+1,maxlen);
return res;
}
int main()
{
string str1,str2;
while(cin>>str1>>str2)
{
if(str1.size()>str2.size())
cout<else
cout<cout<return 0;
}
解二:
#include
#include
#include
#include
using namespace std;
//找到子串中最长的
int findMaxLen(vector<string> vec)
{
int res=vec[0].size();
for(int i=0;iif(vec[i].size()>res)
res=vec[i].size();
}
return res;
}
string Find(string s1,string s2)
{
string res;
//存放所有的子串
vector<string> vec;
int len1=s1.size();
int len2=s2.size();
int i=0,j=0,w=0;
//三个for循环
for(i=0;ifor(j=0;jstring word="";
int index=i;
for(w=j;wif(s1[index++]==s2[w])
word.push_back(s2[w]);
else
break;
}
if(!word.empty())
vec.push_back(word);
}
}
int max=findMaxLen(vec);
for(int i=0;iif(vec[i].size()==max)
{
res=vec[i];
break;
}
}
return res;
}
int main()
{
string s1,s2;
while(cin>>s1>>s2)
{
if(s1.size()cout<else
cout<
#include
#include
using namespace std;
int min(int i,int j)
{
return i>j?j:i;
}
int minNum(int in1,int in2)
{
int div1=in1;
int div2=in2;
int res=1;
vector<int> vec;
for(int i=2;i<=min(div1,div2);++i)
{
if(div1%i==0&&div2%i==0)
{
vec.push_back(i);
div1/=i;
div2/=i;
}
}
vec.push_back(div1);
vec.push_back(div2);
for(int i=0;ireturn res;
}
int main()
{
int i,j;
while(cin>>i>>j)
{
cout<
#include
#include
using namespace std;
const double DIV=0.0000001;
inline double abs(double x){return (x>0?x:-x);}
static double getCubeRoot(double input)
{
// double sum=0;
double res;
//牛顿迭代
for(res=1.0;!(abs(input-res*res*res)2*res*res*res+input)/(3*res*res))
;
return res;
}
int main()
{
double i;
while(cin>>i)
{
//改变输出的格式
cout << fixed; //定点十进制
cout.precision(1); //默认精度值控制为总位数,fixed/scientific/hexfloat之后改变为控制小数点后的位数
cout<
20.字符逆序
#include
#include
#include
using namespace std;
int main()
{
string in;
//注意输入是一行字符串,所以必须要用getline来读取一行输入
while(getline(cin,in))
{
string res;
stack<char> stk;
for(int i=0;ifor(int i=0;ichar ch=stk.top();
res+=ch;
stk.pop();
}
cout<
21.记负均正II
#include
#include
using namespace std;
int main()
{
vector<int> pos;
vector<int> neg;
int in=0;
double sum=0;
while(cin>>in)
{
if(in>=0)
pos.push_back(in);
else
neg.push_back(in);
}
for(int i=0;icout<double tmp=sum/(pos.size());
cout<//强制显示浮点数的小数点
cout<
22.Redraiment的走法–最大递增子序列问题;参照30合唱队问题
#include
#include
using namespace std;
int GetResult(int num, int* pInput)
{
//记录每个节点步数
int *step=new int[num];
//记录最长的结果
int pResult=1;
//初始化每个节点步数数组
for(int i=0;istep[i]=1;
//动态规划
for(int i=1;ifor(int j=0;j//若果递增且当前递增序列个数大于已存的值,更新
if(pInput[i]>pInput[j]&&step[j]+1>step[i])
{
step[i]=step[j]+1;
if(step[i]>pResult)
pResult=step[i];
}
return pResult;
}
int main()
{
int num;
while(cin>>num)
{
int *in=new int[num];
for(int i=0;i>in[i];
cout<in)<
23.字符统计。按字符出现次数从多到少打印,同样次数按大小打印。
//思路:统计最多次出现的字符,从最多次开始打印,每次最多次--,再次遍历map。直到max到0,保证打印完所有的字符。
#include
#include
#include
using namespace std;
void Sol(string in)
{
map<char,int> index;
//统计最长的字符
int max=0;
for(int i=0;iif(index[in[i]]>max)
max=index[in[i]];
}
while(max)
{
for(map<char,int>::iterator it=index.begin();it!=index.end();it++)
{
if(it->second==max)
cout<first;
}
max--;
}
return;
}
int main()
{
string in;
while(cin>>in)
{
Sol(in);
cout<
24.输入整型数组和排序标识,对其元素按照升序或降序进行排序
思路:快排做!快排的代码一定要熟悉!!!!!!!
#include
#include
#include
using namespace std;
int partition(vector<int>& in,int low,int high,int flag)
{
int key=in[low];
while(low0)
{
while(lowkey)
high--;
if(lowwhile(lowif(lowwhile(low1)
{
while(lowif(lowwhile(lowkey)
low++;
if(lowreturn low;
}
void QuickSort(vector<int>& in,int low,int high,int flag)
{
if(low>=high) return;
int index=partition(in,low,high,flag);
QuickSort(in,low,index-1,flag);
QuickSort(in,index+1,high,flag);
}
void sortIntegerArray(vector<int>& in, int flag)
{
QuickSort(in,0,in.size()-1,flag);
}
int main()
{
int n;
while(cin>>n)
{
vector<int> in;
int w;
for(int i=0;icin>>w;
in.push_back(w);
}
int flag;
cin>>flag;
sortIntegerArray(in,flag);
for(int i=0;i1;++i)
cout<" ";
cout<1]<
25.自守数
思路:转换为string,判断短的字符串是否匹配。
#include
#include
#include
using namespace std;
//判断是否是自守数
bool isT(int in)
{
int square=in*in;
string s1;
string s2;
//in转换为逆序的string
while(in)
{
s1+=(in%10+'0');
in/=10;
}
//平方数转换为逆序的string
while(square)
{
s2+=(square%10+'0');
square/=10;
}
int i;
//判断逆序后的结果前几位是否相等
for(i=0;iif(s1[i]!=s2[i])
break;
}
if(i==s1.size())
return true;
return false;
}
int main()
{
int n;
while(cin>>n)
{
int count=0;
for(int i=0;iif(isT(i))
count++;
}
cout<
26.数字前后加上符号“*”
思路:辅助空间字符串来做~
#include
#include<string>
using namespace std;
/*
输入例子:
Jkdi234klowe90a3
输出例子:
Jkdi*234*klowe*90*a*3*
*/
int main()
{
string in;
while(getline(cin,in))
{
string res;
int flag=0;
for(int i=0;i<in.size();i++)
{
if(flag==0&&!isdigit(in[i]))
res+=in[i];
else if(flag==0&&isdigit(in[i]))
{
res+='*';
res+=in[i];
flag=1;
}
else if(flag==1&&isdigit(in[i]))
{
res+=in[i];
flag=1;
}
else if(flag==1&&!isdigit(in[i]))
{
res+='*';
res+=in[i];
flag=0;
}
}
if(isdigit(in[in.size()-1]))
res+='*';
cout<
27.记票统计
思路:用vector实现输入的人名的先后,用map来做索引操作。
#include
#include
#include
#include
#include
using namespace std;
map<string,int> index;
vector<string> vec;
int Invalid=0;
unsigned int AddCandidate (string name)
{
int flag=1;
if(find(vec.begin(),vec.end(),name)==vec.end())
vec.push_back(name);
else
flag=0;
return flag;
}
void Vote(string name)
{
if(find(vec.begin(),vec.end(),name)!=vec.end())
index[name]++;
else
Invalid++;
}
unsigned int GetVoteResult (string name)
{
if(find(vec.begin(),vec.end(),name)!=vec.end())
return index[name];
return Invalid;
}
void Clear()
{
index.clear();
vec.clear();
Invalid=0;
}
int main()
{
//候选人个数
int n;
int voteNum;
while(cin>>n)
{
for(int i=0;istring name;
cin>>name;
AddCandidate(name);
}
cin>>voteNum;
for(int i=0;istring name;
cin>>name;
Vote(name);
}
for(int i=0;icout<" : "<cout<<"Invalid : "<
28.在字符串中找出连续最长的数字串
思路:注意考虑最后若为连续数字串的处理。
#include
#include
#include
#include
#include
using namespace std;
int main()
{
string in;
while(cin>>in)
{
vector<string> vec;
int flag=0;
string tmp;
for(int i=0;iif(flag==0&&isdigit(in[i]))
{
tmp+=in[i];
flag=1;
}
else if(flag==1&&isdigit(in[i]))
{
tmp+=in[i];
if(i==in.size()-1)
vec.push_back(tmp);
}
else if(flag==1&&!isdigit(in[i]))
{
vec.push_back(tmp);
tmp.clear();
flag=0;
}
}
int max=0;
for(int i=0;iif(vec[i].size()>max)
max=vec[i].size();
}
for(int i=0;iif(vec[i].size()==max)
cout<cout<<","<
29.合法IP
思路:ip考虑是否为四个字符串,字符串转int后,必须小于255。且IP地址中除了数字和.不能有其他的字符。
#include
#include
#include
#include
#include
using namespace std;
int main()
{
string in;
while(cin>>in)
{
vector<string> vec;
string res="YES";
string tmp;
for(int i=0;iif(!(isdigit(in[i])||in[i]=='.'))
res="NO";
}
for(int i=0;iif(isdigit(in[i]))
{
tmp+=in[i];
if(i==in.size()-1)
vec.push_back(tmp);;
}
else if(in[i]=='.')
{
vec.push_back(tmp);
tmp.clear();
}
}
if(vec.size()!=4)
res="NO";
for(int i=0;istringstream ss;
ss<int num;
ss>>num;
if(num>255)
{
res="NO";
break;
}
}
cout<
30.合唱队问题
思路:动态规划;
两次遍历,第一次找从头到尾最长递增子序列,第二次从尾到头找最长递增子序列。
i位置两个序列数组中和最大,则要踢出去的人数最少。最少人数为in+1-max;
#include
#include
#include
#include
#include
using namespace std;
int main()
{
int in;
while(cin>>in)
{
vector<int> vec;
for(int i=0;iint tmp;
cin>>tmp;
vec.push_back(tmp);
}
vector<int> res1(in,1);
vector<int> res2(in,1);
for(int i=1;ifor(int j=0;jif(vec[i]>vec[j]&&res1[j]+1>res1[i])
res1[i]=res1[j]+1;
for(int i=in-2;i>=0;i--)
for(int j=in-1;j>i;--j)
if(vec[i]>vec[j]&&res2[j]+1>res2[i])
res2[i]=res2[j]+1;
int max=-1;
for(int i=0;iint sum=res1[i]+res2[i];
if(sum>max)
max=sum;
}
cout<1-max<
31.将真分数分解为埃及分数(贪心算法)
具体步骤参见:http://blog.csdn.net/hnust_xiehonghao/article/details/8682673
设a、b为互质正整数,aa/b 可用以下的步骤分解成若干个单位分数之和:
步骤一: 用b 除以a,得商数q1 及余数r1。`(r1=b - a*q1)`
步骤二:把a/b 记作:`a/b=1/(q1+1)+(a-r)/b(q1+1)`
步骤三:重复步骤2,直到分解完毕
3/7=1/3+2/21=1/3+1/11+1/231
13/23=1/2+3/46=1/2+1/16+1/368
以上其实是数学家斐波那契提出的一种求解埃及分数的贪心算法,准确的算法表述应该是这样的:
设某个真分数的分子为a,分母为b;
把b除以a的商部分加1后的值作为埃及分数的某一个分母c;
将a乘以c再减去b,作为新的a;
将b乘以c,得到新的b;
如果a大于1且能整除b,则最后一个分母为b/a;算法结束;
或者,如果a等于1,则,最后一个分母为b;算法结束;
否则重复上面的步骤。
牛客的测试用例有问题,思想对了就行了。答案不唯一。
#include
#include
#include
#include
#include
using namespace std;
string toS(int i)
{
stringstream ss;
ss<string res;
ss>>res;
return res;
}
int toI(string i)
{
stringstream ss;
ss<int res;
ss>>res;
return res;
}
string Sol(string in)
{
string s1,s2;
int flag=0;
for(int i=0;iif(flag==0&&in[i]!='/')
s1+=in[i];
else if(flag==0&&in[i]=='/')
flag=1;
else if(flag==1)
s2+=in[i];
}
int a=toI(s1);
int b=toI(s2);
vector<string> vec;
int q1,r1;
while(b%a!=0)
{
q1=b/a;
r1=b%a;
a=a-r1;
b=b*(q1+1);
string tmp;
tmp="1/"+toS(q1+1);
vec.push_back(tmp);
}
string tmp;
tmp="1/"+toS(b/a);
vec.push_back(tmp);
string res;
for(int i=0;i1;++i)
res+=vec[i]+'+';
res+=vec[vec.size()-1];
return res;
}
int main()
{
string in;
while(cin>>in)
{
cout<
32.不区分大小写,求最长公共子串。
思路:对判断两个字符是否相等重新定义函数来做。
#include
#include
#include
#include
#include
#include
using namespace std;
bool isEqual(char i,char j)
{
if(i==j||isupper(i)==j)
return true;
return false;
}
int maxString(string str1,string str2)
{
int len1=str1.size();
int len2=str2.size();
int maxlen=0;
vector<int> tmp(len1,0);
vector<int> cur(len1,0);
for(int i=0;i0);
for(int j=0;jif(isEqual(str1[j],str2[i]))
{
if(j==0)
cur[j]=1;
else
cur[j]=tmp[j-1]+1;
}
if(cur[j]>maxlen)
maxlen=cur[j];
}
tmp.assign(cur.begin(),cur.end());
}
return maxlen;
}
int main()
{
string in1,in2;
while(cin>>in1>>in2)
{
cout<
33.字符串的编辑距离问题–计算字符串的相似度
#include
#include
#include
#include
#include
#include
using namespace std;
int min(int a,int b,int c)
{
int res=a;
if(bif(creturn res;
}
string toS(int i)
{
stringstream ss;
ss<string res;
ss>>res;
res="1/"+res;
return res;
}
string disString(string str1,string str2)
{
int len1=str1.size();
int len2=str2.size();
vector<vector<int>> arr;
for(int i=0;i1;++i)
{
vector<int> tmp;
for(int j=0;j1;++j)
{
tmp.push_back(0);
}
arr.push_back(tmp);
}
for(int i=0;i1;++i)
{
arr[i][0]=i;
}
for(int i=0;i1;++i)
{
arr[0][i]=i;
}
for(int i=1;i1;++i)
{
for(int j=1;j1;++j)
{
if(str1[i-1]==str2[j-1])
arr[i][j]=min(arr[i-1][j-1],arr[i-1][j]+1,arr[i][j-1]+1);
else
arr[i][j]=min(arr[i-1][j-1]+1,arr[i-1][j]+1,arr[i][j-1]+1);
}
}
return toS(arr[len1][len2]+1);
}
int main()
{
string in1,in2;
while(cin>>in1>>in2){
cout<
34.火车进站问题
#include
#include
#include
#include
#include
using namespace std;
void Sol(vector<int> in,stack<int> sk,vector<int> vec,int index,vector<vector<int>>& RES)
{
for(int i=sk.size();i>=0;--i)
{
stack<int> stmp(sk);
vector<int> vtmp(vec);
for(int j=1;j<=i;++j)
{
int tmp=stmp.top();
stmp.pop();
vtmp.push_back(tmp);
}
stmp.push(in[index]);
if(in.size()-1==index)
{
vector<int> res(vtmp);
while(!stmp.empty())
{
res.push_back(stmp.top());
stmp.pop();
}
RES.push_back(res);
}
else
Sol(in,stmp,vtmp,index+1,RES);
}
}
vector<int> toI(string in)
{
vector<int> res;
for(int i=0;istringstream ss;
ss<int tmp;
ss>>tmp;
res.push_back(tmp);
}
return res;
}
string toS(vector<int> vec)
{
string res;
for(int i=0;istringstream ss;
ss<string tmp;
ss>>tmp;
res+=tmp;
}
return res;
}
vector<vector<int>> handle(vector<vector<int>> in)
{
vector<vector<int>> res;
vector<string> res1;
for(int i=0;istring tmp=toS(in[i]);
res1.push_back(tmp);
}
sort(res1.begin(),res1.end());
for(int i=0;ivector<int> tmp=toI(res1[i]);
res.push_back(tmp);
}
return res;
}
int main()
{
int n;
while(cin>>n)
{
vector<int> in;
stack<int> sk;
vector<int> vec;
vector<vector<int>> RES;
for(int i=0;iint tmp;
cin>>tmp;
in.push_back(tmp);
}
Sol(in,sk,vec,0,RES);
RES=handle(RES);
for(int i=0;ifor(int j=0;jif(j==RES[i].size()-1)
cout<else
cout<" ";
}
cout<