思路:暴力搜,用BFS的方式,生成每一种可能,再对每一种可能进行判断是否回文,进行统计。严重超时!计算一个25个字符的,大概要20多秒!
1 #include <iostream> 2 #include <deque> 3 #include <string> 4 #include <stdio.h> 5 #include <cstring> 6 using namespace std; 7 8 deque<string> a; 9 10 bool isP(string &s ) 11 { 12 string::iterator it1=s.begin(); 13 string::iterator it2=s.end(); 14 while( it1!=it2 && it1!=--it2 ) 15 { 16 if( *it1!=*it2 ) 17 return false; 18 it1++; 19 } 20 return true; 21 } 22 23 unsigned long long count() //判断回文,注意取余 24 { 25 unsigned long long cnt=0; 26 string tmp=""; 27 a.pop_front(); 28 while( !a.empty() ) 29 { 30 tmp =a.front(); 31 32 if( tmp.size()==1 ) 33 cnt++; //单个的情况 34 else if( isP(tmp)==true ) 35 cnt++; 36 37 a.pop_front(); 38 if(cnt>100007 ) 39 cnt %= 100007; 40 } 41 return cnt; 42 } 43 44 int betree(string &s, int len) //生成树 45 { 46 string tmp=""; 47 a.push_back(tmp); 48 49 int i, j, limit =a.size() ; 50 51 for(i=0; i<len; i++) 52 { 53 for(j=0; j<limit; j++) 54 { 55 a.push_back(a.front()); //不装第i个 56 a.push_back(a.front()+s[i]); //装第i个 57 a.pop_front(); 58 } 59 limit =a.size(); 60 } 61 return 0; 62 } 63 64 int main() 65 { 66 //freopen("input.txt","r",stdin); 67 int t, j=0; 68 string s; 69 cin>>t; 70 while(t--) 71 { 72 a.clear(); 73 s=""; 74 cin>>s; 75 betree(s, s.size()); 76 cout<<"Case #"<< ++j<< ": "<< count()<<endl; 77 } 78 return 0; 79 }
BFS超时
另外的思路:有一个感觉,肯定可以用DP,但是状态方程写不出来。
时间: 2024-10-10 09:46:36