USACO 3.1 Contact

来源:互联网 发布:冒泡排序法 java 编辑:程序博客网 时间:2024/06/05 16:17

本人使用字符集为{'0','1'}的trie AC掉了,不过该题的输入输出比较恶心...因为这个错了好几次...

 

USER: A e [chenh193]
TASK: contact
LANG: C++

Compiling...
Compile: OK

Executing...
Test 1: TEST OK [0.011 secs, 8524 KB]
Test 2: TEST OK [0.011 secs, 8520 KB]
Test 3: TEST OK [0.011 secs, 8524 KB]
Test 4: TEST OK [0.022 secs, 8520 KB]
Test 5: TEST OK [0.130 secs, 8652 KB]
Test 6: TEST OK [0.238 secs, 8520 KB]
Test 7: TEST OK [0.259 secs, 8652 KB]

All tests OK.

对于输入的字符串的每一个元素,如果能取到后面的长度为L..R的,那么取完以后插入字典树,在单词结尾处计数.
由于这题的字符集只有{'0','1'},所以这个字典树可以看成一个二叉树,最后统计的时候来一次DFS既可.;


/*
ID: chenh193
PROG: contact
LANG: C++
*/
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<string>
using namespace std;
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define lowbit(x) ((x)&(-(x)))
typedef long long llong;
//字典树
int TL=1;
struct Trie
{
char data;
int next[2],cnt;//字符集...'0','1'
void init(char c){data=c;memset(next,0,sizeof(next));cnt=0;}
}T[200001];
void insw(char *s,int k,int idx)
{
if(!s[k])
{
T[idx].cnt++;//如果cnt>0,那么表示此处有最少一个单词...
return;
}
if(T[idx].next[s[k]-'0']==0)
{
T[idx].next[s[k]-'0']=++TL;
T[TL].init(s[k]);
insw(s,k+1,TL);
}
else
insw(s,k+1,T[idx].next[s[k]-'0']);
}
char buf[13],cstr[200001],gl[101];
vector<string> VS[200001];
void dfs(int x,int k,int a)
{
int i;
if(k!=-1)
buf[k]='0'+a,buf[k+1]=0;
if(T[x].cnt)
VS[T[x].cnt].push_back(buf);
for(i=0;i<2;i++)
{
if(T[x].next[i])
{
dfs(T[x].next[i],k+1,i);
}
}
}
bool scmp(string a,string b)
{
int A=0,B=0,i;
if(a.length()<b.length())return true;
if(a.length()>b.length())return false;
for(i=0;a[i];i++)A=A*2+a[i]-'0';
for(i=0;b[i];i++)B=B*2+b[i]-'0';
return A<B;
}
int main()
{
int L,R,N;
int i,j,k,len,tlen,cnt;
char tmp;
freopen("contact.out","w",stdout);
freopen("contact.in","r",stdin);
scanf("%d%d%d%*c",&L,&R,&N);
cstr[0]=0;
while(gets(gl)!=NULL)strcat(cstr,gl);
len=strlen(cstr);
T[1].init('@');
for(i=0;i<=len-L;i++)
{
tmp=cstr[i+L];
cstr[i+L]=0;
buf[0]=0;
strcpy(buf,cstr+i);
cstr[i+L]=tmp;
tlen=L;
k=i+L;
for(;tlen<=R;)
{
insw(buf,0,1);
if(!cstr[k])break;
buf[tlen++]=cstr[k++];
buf[tlen]=0;
}
}
buf[0]=0;
dfs(1,-1,0);
for(i=200000;i>=1;i--)
{
if(VS[i].size()==0)continue;
N--;
if(N==-1)break;
sort(VS[i].begin(),VS[i].end(),scmp);
printf("%d/n",i);
cnt=1;
cout<<VS[i][0];
for(j=1;j<VS[i].size();j++){if(cnt)cout<<' ';cout<<VS[i][j],cnt++;if(cnt==6)cnt=0,puts("");}
if(cnt)puts("");
}
return 0;
}
原创粉丝点击