题目:http://acm.zju.edu.cn/contests/show_problem.php?cid=154&pid=1003
被判超时的代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int count,i = 0,len,j;
string S;
cin>>S;
count = S.length();
for(len = count;i < len;i++)
{
j=1;
while(S[i-j] == S[i+j] && S[i-j] != NULL && S[i+j] != NULL)
{
++count;
++j;
}
j=1;
while(S[i-j+1] == S[i+j]&& S[i-j+1] != NULL && S[i+j] != NULL )
{
++count;
++j;
}
}
cout<<count;
return 0;
}
反正都已经超时了,再修改代码也不错了的,呵呵,下面是部分优化过的代码,还是没有注释,主要是对程序性能上的优化,在算法上还是老样子,不过优化过的代码通过汇编之后会少段寻找数组地址的代码,在测试string非常大的情况下。能明显使运行时间缩短
#include<iostream>
#include<string>
using namespace std;
int main()
{
int count,i = 0,len,j;
string S;
cin>>S;
count = S.length();
for(len = count;i < len;i++)
{
j=1;
while(S[i-j] == S[i+j] && !(i-j <0 && i+j > len)) //被优化的地方
{
++count;
++j;
}
j=1;
while(S[i-j+1] == S[i+j] && !(i-j < -1 && i+j > len )) //被优化的地方
{
++count;
++j;
}
}
cout<<count-1<<endl;
system("pause");
return 0;
}