字典序问题

来源:互联网 发布:韩语视频翻译软件 编辑:程序博客网 时间:2024/06/06 17:06


我的思路很简单,程序开始前,先做一遍预处理,将处理的数据存到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;}

1 0
原创粉丝点击