MagicWords (SRM433 Div2 500)

题目链接:http://www.topcoder.com/stat?c=problem_statement&pm=10195

直接按描述生成S的所有排列,并计数就可以了。用map缓存一下计算结果,不然会超时
在一个整数vector上用next_permutation算法来生成所有排列的索引。

#include <vector>
#include 
<algorithm>
#include 
<sstream>
#include 
<string>
#include 
<iostream>
#include 
<map>

using namespace std;

         
class MagicWords
              { 
              
public:

               map
<string,bool> m;

              
int count(vector <string> s, int k) 
                  {
                      
int ret = 0;

                      vector
<int> v(s.size());
                      
                      
for(int i=0;i<v.size();++i)
                          v[i] 
= i;

                      m.clear();
                   
                      
do{

                          
string str;
                          
for(int i=0;i<v.size();++i){
                              str
+=s[v[i]]; 
                          }                        
                          
if( isMagic(str,k) )
                              ret
++;

                      }
while( next_permutation(v.begin(),v.end()) );


                      
return ret;
                  } 

              
bool isMagic(string &str,int k){

                  
if(m.find(str)!=m.end())
                      
return m[str];

                  
int cnt = 1;
                  
int len = str.size();
                  
for(int i=1;i<len;++i){
                      
bool ok = true;
                      
for(int j=0;j<len;++j){
                          
if( str[j] != str[(j+i)%len]){
                              ok 
= false;
                              
break;
                          }
                      }

                      
if(ok)
                       cnt
++;
                  }

                  m[str] 
=  (cnt==k);

                  
return cnt==k;
              }
 }



posted on 2009-06-08 20:38 YZY 阅读(867) 评论(0)  编辑 收藏 引用 所属分类: AlgorithmTopCoder


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

<2009年6月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

统计

常用链接

留言簿(2)

随笔分类

随笔档案

搜索

积分与排名

最新评论

阅读排行榜