您的位置:首页 > 其它

Timus 1219

2011-08-06 16:11 204 查看
#include <iostream>
#include <fstream>
using namespace std;

unsigned short counter_3D[26][26][26] = { 0 };
unsigned short counter_2D[26][26] = { 0 };
unsigned short counter_1D[26] = { 0 };
char ret[1000001] = { '\0' };
char seq[3] = { 0 };

int cnt=0,check[26] = { 0 }, check2D[26][26] = { 0 }, check3D[26][26][26] = { 0 };
char test[1000001] = { '\0' };

int main() {

/*ofstream fout;
fout.open("output.txt");*/

int i,p1,p2,p3,j,l1,l2,l3,tmp;
seq[0] = seq[1] = 0;
p1 = 0; p2 = 1; p3 = 2;
ret[0] = ret[1] = 'a';

counter_2D[seq[0]][seq[0]]++;
counter_1D[seq[0]]++;
counter_1D[seq[1]]++;

for(i=2;i<1000000;i++) {

l1 = seq[p1];
l2 = seq[p2];
for(j=1;j<=26;j++) {
l3 = (seq[p3] + j) % 26;
if(counter_3D[l1][l2][l3] < 100 && counter_2D[l2][l3] < 2000 && counter_1D[l3] < 40000) {
ret[i] = l3 + 'a';
seq[p3] = l3;
tmp = p1;
p1 = p2;
p2 = p3;
p3 = tmp;
counter_3D[l1][l2][l3]++;
counter_2D[l2][l3]++;
counter_1D[l3]++;
break;
}
}
}

cout<<ret;

return 0;
}
/*fout.close();
ifstream fin;
fin.open("output.txt",ios_base::in);

i = 0;
while(!fin.eof())
fin>>test[i++];

cnt = strlen(test);
cout<<"count:"<<cnt<<endl;

check[test[0]-'a']++;
check[test[1]-'a']++;
check2D[test[0] - 'a'][test[1] - 'a']++;

i = 2;
while(i < cnt ) {
check[test[i] - 'a']++;
check2D[test[i-1] - 'a'][test[i] - 'a']++;
check3D[test[i-2] - 'a'][test[i-1] - 'a'][test[i] - 'a']++;
i++;
}

for(int i=0;i<26;i++) {
if(check[i] > 40000) {
cout<<"1 D exceeds\n"<<endl;
return 0;
}
for(int j=0;j<26;j++) {
if(check2D[i][j] > 2000) {
cout<<"2 D exceeds"<<check2D[i][j]<<endl;
cout<<(char)(i + 'a')<<(char)(j + 'a')<<endl;
return 0;
}
for(int k=0;k<26;k++) {
if(check3D[i][j][k] > 100) {
cout<<"3 D exceeds"<<check3D[i][j][k]<<endl;
cout<<(char)(i + 'a')<<(char)(j + 'a')<<(char)(k + 'a')<<endl;
}
}
}
}

return 0;
}*/


这题我的基本思路是,每次都根据前面的两个字母,来判断跟第三个字母构成的组合是否能用(超过出现次数就不能了)。

不过这里有个小问题就是,例如aaa, 如果循环下一个找的还是aaa,那么这样很快会耗掉"aaa"这组合的次数,通过验证这样的话构造不了1000000个。

但一个trick就是每次找的时候都从上一个找个字母的后一个字符开始,例如aaa,下一个找aab,然后找abc,bcd这样,马上就OK了 ^_^
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: