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了 ^_^
相关文章推荐
- Timus 1219. Symbolic Sequence
- Timus 1152. The False Mirrors
- Timus 1004. Sightseeing trip
- timus graph theory
- Timus 1515
- [恢]hdu 1219
- [timus] 1020. Rope
- Timus 1009. K-based Numbers
- timus_1003_floyd_warshall
- 杭电1219 AC Me
- timus_1007_bfs
- Timus 1152. False Mirrors
- ural1890、Timus1890【树状数组解法】
- timus1982. Electrification Plan---最小生成树
- Timus 1009 DP
- Timus 1820. Ural Steaks 题解
- Timus 1025. Democracy in Danger 题解
- Timus 1777. Anindilyakwa 奇怪的数数问题
- codevs1219 骑士游历
- timus 1242. Werewolf【队列+结构体】