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;
}
- USACO 3.1 Contact (contact)
- USACO 3.1 Contact
- USACO 3.1.5 Contact
- usaco 3.1 Contact
- USACO 3.1.5 Contact
- usaco 3.1 Contact
- USACO 3.1.5 Contact
- USACO--3.1Contact
- [USACO]3.1.5 Contact
- usaco 3.1 Contact
- USACO-Section 3.1-PROB Contact
- usaco 3.1 contact 2008.7.18
- usaco contact
- usaco Contact
- USACO-Contact
- usaco contact
- usaco Chapter 3 section 3.1 Contact
- USACO Section 3.1 Contact - AC自动机..
- 精妙SQL语句
- 常用正则表达式
- C#中保留N位小数的几种方法(转)
- 深入浅出C# 中文版 图文皆译 第四章 类型和引用 page171
- 保证你现在和未来不失业的十种关键技术
- USACO 3.1 Contact
- 容器 API
- python challenge 7-9
- 网页爬虫
- 大富翁游戏原型
- 射击游戏原型
- 初识OpenSearch
- .NET和SQL Server中“空值”辨析 (DBNull与Null的区别) [转]
- 贪吃蛇游戏