POJ1002 TLE
POJ1002 TLE求助!
代码有点长,delHyp()是删除输入串中的‘-’,changeStr()是全部转为‘0’-‘9’之间的字符,转换后之接冒泡排序的,可是一直超时;后来换了qsort()之后还是TLE,实在不知道什么地方效率低,还望高手指点……
PS:总是很喜欢C++的动态分配,感觉这样空间不会浪费,不知道是不是因为这个耗费了太多时间哦?
#include <iostream>
#include <string>
using namespace std;
void changeStr(string & a)
{
int i = 0;
int len = a.length();
for (i = 0; i < len; i++)
{
if (a[i] == 'A' || a[i] == 'B' || a[i] == 'C')
a[i] = '2';
else if (a[i] == 'D' || a[i] == 'E' || a[i] == 'F')
a[i] = '3';
else if (a[i] == 'G' || a[i] == 'H' || a[i] == 'I')
a[i] = '4';
else if (a[i] == 'J' || a[i] == 'K' || a[i] == 'L')
a[i] = '5';
else if (a[i] == 'M' || a[i] == 'N' || a[i] == 'O')
a[i] = '6';
else if (a[i] == 'P' || a[i] == 'S' || a[i] == 'R')
a[i] = '7';
else if (a[i] == 'T' || a[i] == 'U' || a[i] == 'V')
a[i] = '8';
else if (a[i] == 'W' || a[i] == 'X' || a[i] == 'Y')
a[i] = '9';
}
}
void delHyp(string & a)
{
string::iterator it;
for (it = a.begin(); it <= a.end(); it++)
{
if (*it == '-')
a.erase(it);
}
}
int main()
{
int n;
cin >> n;
string *str = new string[n];
string *reStr = new string[n];
int *flagStr = new int[n];
int i = 0;
for (i = 0; i < n; i++)
{
cin >> str[i];
delHyp(str[i]);
changeStr(str[i]);
flagStr[i] = 0;
}
int j = 0;
int Gflag = 0;
for (i = 0; i < n; i++)
{
if (flagStr[i] == 0)
{
for (j = i + 1; j < n; j++)
{
if (str[i] == str[j])
{
flagStr[i]++;
flagStr[j] = -1;
Gflag = 1;
}
}
}
}
if (Gflag == 0)
cout << "No duplicates." << endl;
else
{
j = 0;
for(i = 0; i < n; i++)
{
if (flagStr[i] > 0)
{
reStr[j] = str[i];
flagStr[j] = flagStr[i];
j++;
}
}
int reStrlen = j;
string temp;
int flagTmp;
for ( i = 0; i < reStrlen; i++)
{
for (j = i + 1; j < reStrlen; j++)
if (reStr[i] > reStr[j])
{
temp = reStr[i];
reStr[i] = reStr[j];
reStr[j] = temp;
flagTmp = flagStr[i];
flagStr[i] = flagStr[j];
flagStr[j] = flagTmp;
}
}
for (i = 0; i < reStrlen; i++)
{
for (j = 0; j < 3; j++)
{
cout << reStr[i][j];
}
cout << '-';
for (j = 3; j < 7; j++ )
cout << reStr[i][j];
代码有点长,delHyp()是删除输入串中的‘-’,changeStr()是全部转为‘0’-‘9’之间的字符,转换后之接冒泡排序的,可是一直超时;后来换了qsort()之后还是TLE,实在不知道什么地方效率低,还望高手指点……
PS:总是很喜欢C++的动态分配,感觉这样空间不会浪费,不知道是不是因为这个耗费了太多时间哦?
#include <iostream>
#include <string>
using namespace std;
void changeStr(string & a)
{
int i = 0;
int len = a.length();
for (i = 0; i < len; i++)
{
if (a[i] == 'A' || a[i] == 'B' || a[i] == 'C')
a[i] = '2';
else if (a[i] == 'D' || a[i] == 'E' || a[i] == 'F')
a[i] = '3';
else if (a[i] == 'G' || a[i] == 'H' || a[i] == 'I')
a[i] = '4';
else if (a[i] == 'J' || a[i] == 'K' || a[i] == 'L')
a[i] = '5';
else if (a[i] == 'M' || a[i] == 'N' || a[i] == 'O')
a[i] = '6';
else if (a[i] == 'P' || a[i] == 'S' || a[i] == 'R')
a[i] = '7';
else if (a[i] == 'T' || a[i] == 'U' || a[i] == 'V')
a[i] = '8';
else if (a[i] == 'W' || a[i] == 'X' || a[i] == 'Y')
a[i] = '9';
}
}
void delHyp(string & a)
{
string::iterator it;
for (it = a.begin(); it <= a.end(); it++)
{
if (*it == '-')
a.erase(it);
}
}
int main()
{
int n;
cin >> n;
string *str = new string[n];
string *reStr = new string[n];
int *flagStr = new int[n];
int i = 0;
for (i = 0; i < n; i++)
{
cin >> str[i];
delHyp(str[i]);
changeStr(str[i]);
flagStr[i] = 0;
}
int j = 0;
int Gflag = 0;
for (i = 0; i < n; i++)
{
if (flagStr[i] == 0)
{
for (j = i + 1; j < n; j++)
{
if (str[i] == str[j])
{
flagStr[i]++;
flagStr[j] = -1;
Gflag = 1;
}
}
}
}
if (Gflag == 0)
cout << "No duplicates." << endl;
else
{
j = 0;
for(i = 0; i < n; i++)
{
if (flagStr[i] > 0)
{
reStr[j] = str[i];
flagStr[j] = flagStr[i];
j++;
}
}
int reStrlen = j;
string temp;
int flagTmp;
for ( i = 0; i < reStrlen; i++)
{
for (j = i + 1; j < reStrlen; j++)
if (reStr[i] > reStr[j])
{
temp = reStr[i];
reStr[i] = reStr[j];
reStr[j] = temp;
flagTmp = flagStr[i];
flagStr[i] = flagStr[j];
flagStr[j] = flagTmp;
}
}
for (i = 0; i < reStrlen; i++)
{
for (j = 0; j < 3; j++)
{
cout << reStr[i][j];
}
cout << '-';
for (j = 3; j < 7; j++ )
cout << reStr[i][j];