因为我在测试的时候加了str[0]=='0'输入结束
交替的时候忘了删了,以为是自己用数组写的,数组开大了内存会超
开小了会WA,就又用map写了一个
在写map的过程中发现了输入的错误,改了一下居然就过了...
trie-782ms代码如下:
#include <cctype>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define MAXN 10010
using namespace std;
int sz;
int ch[MAXN][270];
char str[MAXN];
int val[MAXN];
int sum;
int id(char ch) {
return ch;
}
void insert(char s[], int v) {
int u = 0, n = strlen(s), c;
for(int i=0; i<n; ++i) {
c = id(s[i]);
if(!ch[u][c]) {
val[sz] = 0;
ch[u][c] = sz++;
}
u = ch[u][c];
}
val[u] += v;
}
void dfs(int u, int t) {
if(val[u]) {
str[t] = '\0';
printf("%s %.4f\n", str, val[u]*100.0/sum);
}
for(int i=0; i<=256; ++i) {
if(ch[u][i]) {
str[t] = i;
dfs(ch[u][i], t+1);
}
}
return ;
}
int main(void) {
sum = 0;
sz = 1;
memset(val, 0, sizeof(val));
memset(ch, 0, sizeof(ch));
while(gets(str)!=NULL) {
sum++;
insert(str, 1);
}
memset(str, 0, sizeof(str));
dfs(0, 0);
return 0;
}
map写的1500ms代码如下:
#include <map>
#include <cstdio>
#include <string>
using namespace std;
map<string, int> ans;
int main(void) {
int sum = 0;
char str[32];
while(gets(str)) {
ans[str]++;
sum++;
}
for(map<string, int>::iterator it = ans.begin(); it!=ans.end(); ++it) {
printf("%s ", it->first.c_str());
printf("%.4f\n", it->second*100.0/sum);
}
}