矩阵乘法
[ ] 洛谷P5004
[ ] BZOJ5082
trie树
[x] POJ2418 题目
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define MAXN 300030 using namespace std; #define long long LL #define eps 1e-8 int tot=0,sum; char ss[110],s[110]; struct Trie{ int nex[256]; double num;}trie[MAXN]; void insert(char s[]) { int now=0,len=strlen(s+1); for(int i=1;i<=len;i++) { int ch=s[i]; if(!trie[now].nex[ch]) trie[now].nex[ch]=++tot; now=trie[now].nex[ch]; } trie[now].num++; } void print(int p,int len) { if(trie[p].num>=eps) printf("%s %.4lf\n",ss,trie[p].num*100/sum); for(int i=1;i<=256;i++) { if(trie[p].nex[i]!=0) { ss[len]=i; print(trie[p].nex[i],len+1); ss[len]='\0'; } } } int main() { while(gets(s+1)) { insert(s); sum++; } print(0,0); return 0; }
[ ] POJ3283
[x] POJ2001 题目
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define MAXN 300001 using namespace std; int tot=0,cnt=0; char a[10001][31]; struct Trie{ int nex[27];int num;}trie[MAXN]; void insert(char s[]) { int now=0,len=strlen(s+1); for(int i=1;i<=len;i++) { int ch=s[i]-'a'; if(!trie[now].nex[ch]) trie[now].nex[ch]=++tot; now=trie[now].nex[ch]; trie[now].num++; } } void find(char s[]) { int now=0,len=strlen(s+1); for(int i=1;i<=len;i++) { if(trie[now].num==1) break; int ch=s[i]-'a'; cout<<(char)s[i]; now=trie[now].nex[ch]; } } int main() { while(gets(a[++cnt]+1)) insert(a[cnt]); for(int i=1;i<=tot;i++) { cout<<a[i]+1<<' '; find(a[i]); cout<<endl; } return 0; }
[ ] 洛谷P3065
[ ] POJ3764