Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

不明白为什么会超时。。(附代码)链接后的字符串不用记录吗?

Posted by TangMing at 2009-07-24 16:19:10 on Problem 1699 and last updated at 2009-07-24 16:20:54
#include<iostream>
#include<string>
using namespace std;
string ss;//记录连接后的结果
string str[21];
int flag[21];
int n,ans=100000;
bool ok=false;
int concat(string str)//求ss串合并str串后,ss串需要增加的长度
{
   int len1=ss.length();
   int len2=str.length();
   int i,j,t=0,k;
   if(ss.length()==0)return len2;
   if(ss.find(str)!=4294967295){return 0;}
   if(str.find(ss)!=4294967295){return 0;}
   for(i=0;i<len1;i++)
   {
      for(k=i,j=0;k<len1&&j<len2;k++)
	  {
		  if(ss[k]==str[j]){t++;j++;}
		  else {t=0;j=0;break;}
	  }
	  if(t!=0)
	  {
	      break;
	  }
   }
   t=len2-t;
   return t;
}
void dfs(int ii)
{
   int i,j;
   if(ii==n+1)
   {
      if(ans>ss.length())ans=ss.length();
      //cout<<ss<<endl;//这里输出发现搜索次数确实已经很少了,,还是TLE了!!!
      return;
   }
   for(i=0;i<n;i++)
   {
      if(flag[i]==1)continue;    	 
	  int hh=concat(str[i]);//增加的长度	  
	  if(ss.length()+hh>=ans)continue;
	   flag[i]=1;
	  if(hh!=0)
	  {
	    for(j=str[i].length()-hh;j<str[i].length();j++)
			ss+=str[i][j];
	  }
	  
	  dfs(ii+1);	  
	  string::iterator it=ss.begin();
	  ss.erase(it+ss.length()-hh,it+ss.length());
	  flag[i]=0;
	 
   }
}
int main()
{  
 
   int k;
   int ca;
   char aa[21];
   scanf("%d",&ca);
   while(ca--)
   {
   memset(flag,0,sizeof(flag));
   ans=100000;
   scanf("%d",&n);
   for(k=0;k<n;k++)
   {scanf("%s",aa); str[k]=aa;}
   dfs(1);
   printf("%d\n",ans);
   }
   return 0;
}

,,难道链接后的字符串不用记录吗?

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator