usaco contact

hehe.....

第一遍看完題目時,完全沒看明白什麼意思,就直接看輸入輸出去了。猜到個大致意思了,然後纔看題的。

懂了後,第一想法是覺得這題目很難,有點不太想做了,因爲最近做USACO上的題目,基本每個都得花一兩天。難受啊。。。

後來出去走走,回來一坐下,馬上就有想法了。。。。01010101010太好壓縮了吧。。。

Three space-separated integers: A, B, N; (1 <= N < 50)(1 <= A <= B <= 12)

搜索的連續子串最大長度才12,2^12=4096,可以開個12*4096的數組用來記錄出現次數。所有的情況最多也就2*10^5*12 = 10^6,可以枚舉下。


代碼如下:

/*   
ID: guo geer   
PROG: contact
LANG: C++   
*/  


#include<iostream>
#include<cstring>
#include<fstream>
using namespace std;


#define M 12
#define N  4096
int res[M+1][N+1]; //2^12 = 4096
int bin[M+1];


#define LENGTH 200000 
char input[LENGTH + 1];


int main()
{
ofstream fout("contact.out");
ifstream fin("contact.in");


int i,j,k;
bin[0] = 1;
for(i=1; i<=M; i++)
bin[i] = 2*bin[i-1];
int a, b, n;
while(fin>>a>>b>>n)
{
input[0] = '\0';
char str[81];


while(fin>>str)
{
strcat(input, str);
if(strlen(str) < 80)
break;
}


for(i=0; i<=M; i++)
for(j=0; j<=N; j++)
res[i][j] = 0;


for(i=0; input[i] != '\0'; i++)
{
int sum = 0;
for(j=0; j<12 && input[i+j] != '\0'; j++)
{
sum = sum * 2 + input[i+j] - '0';
res[j+1][sum] ++;
}
}


int Max = 0;
for(i=a; i<=b; i++)
for(j=0; j<bin[i]; j++)
if(Max < res[i][j])
Max = res[i][j];


int count = 0;
for(i=Max; i> 0 && count < n; i--)
{
int kk = 0;
for(j=a; j<=b && count < n; j++)
for(k=0; k<=bin[j] && count < n; k++)
if(res[j][k] == i)
{
kk ++;
int  x;
if(kk == 1)
fout<<i<<endl;


if(kk != 1 && kk % 6 == 1)
fout<<'\n';
if(kk % 6 != 1)
fout<<' ';
for(x = 1; x<=j; x++)
if(bin[j-x]&k)
fout<<'1';
else fout << '0';
}
if(kk != 0)
{
fout<<endl;
count ++;
}
} 
}


return 0;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章