字典序问题
2016-09-19 19:25
375 查看
我的思路很简单,程序开始前,先做一遍预处理,将处理的数据存到map中,处理时用到类似DP的思想进行优化。
#include<iostream>
#include<map>
#include<string>
#include<cstdlib>
using namespace std;
string book;
map<string,int> mymap[7];//前一个下标表示字符串长度
long long size=1;
map<string,int>::iterator itemap;
//len代表字符长度 rank代表此时生成的新字符串已有几个字符 big代表当前最大字符 s则是当前生成的新字符串内容
void dfs(int len, int rank,int big,string s)
{
if(len == rank) //当生成的新字符串长度等于字符串长度时,放入map
{
mymap[len][s] = size++;
return;
}
if(big == 26) //当最大字符已经是z时 返回
{
return;
}
for(int i=big+1; i<=26; i++)
{
dfs(len, rank+1, big+1, s+book[i]);
}
}
void init()
{
for(int i=1;i<=26;i++)
{
string ss="";
ss += 'a'+i-1;
book[i] = 'a'+i-1;
mymap[1][ss] = size++;
}
for(int i=1;i<6;i++)
{
map<string,int> mapp = mymap[i];
for(itemap=mapp.begin(); itemap!=mapp.end(); ++itemap)
{
string ss = itemap->first;
string st="";
st = ss[ss.size()-1];
//cout<<"最大字母:"<<st<<endl;
dfs(i+1,i,mymap[1][st],ss);
}
}
}
int main()
{
init();
int N;
string str;
//测试代码块 可无视
/*cout<<mymap[1]["a"]<<endl;
cout<<mymap[1]["z"]<<endl;
cout<<mymap[2]["ad"]<<endl;
cout<<mymap[6]["uvwxyz"]<<endl;*/
/*FILE *fp=fopen("file1.txt", "w+");
for(int i=1;i<=6;i++)
{
map<string,int> mapp = mymap[i];
for(itemap=mapp.begin(); itemap!=mapp.end(); ++itemap)
{
//cout<<itemap->first<<" "<<itemap->second<<endl;
fprintf(fp,"%s %d\n",(itemap->first).c_str(),itemap->second);
}
}*/
while(cin>>N)
{
for(int i=0;i<N;i++)
{
cin>>str;
cout<<mymap[str.size()][str]<<endl;
}
}
return 0;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- android Google Map获取地理位置信息的方法
- Spark RDD API详解(一) Map和Reduce
- Python中map()函数浅析
- 关于指针的一些事情
- Android使用Google Map浅谈
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二