uva 11732 "strcmp()" Anyone?

来源:互联网 发布:淘宝运营 知乎 编辑:程序博客网 时间:2024/05/22 10:28

题目:"strcmp()" Anyone?


思路:

将所有单词记入trie中,再查找。


注意:

1、用 long long 。

2、在插入时,应在字符串后多插入一个\0,不然 "there" 和 "the" 这种会有问题。


代码:

#include <cstdio>#include <iostream>#include <algorithm>#include <stack>#include <queue>#include <deque>#include <set>#include <cstring>#include <map>using namespace std;#define maxn 4000#define maxm 1000#define maxnode maxm*maxnint n;struct Trie{int head[maxnode+5];int next[maxnode+5];char ch[maxnode+5];int sum[maxnode+5];int sz;long long ans;void clear(){memset(head,0,sizeof(head));memset(next,0,sizeof(next));memset(ch,0,sizeof(ch));memset(sum,0,sizeof(sum));sz=1,ans=0;}void insert(char* s){long long y=0;int u=0,Size=strlen(s);sum[0]++;for(int i=0;i<=Size;i++){ bool flag=false;char x=s[i];int j;for(j=head[u];j;j=next[j]){ if(ch[j]==x) {flag=true;break;}}if(flag==false){ch[++sz]=x;next[sz]=head[u];head[u]=sz;j=sz;}u=j,sum[u]++;}ans+=y;}long long cnt(int d,int u){if(head[u]==0) return ans=ans+sum[u]*(sum[u]-1)*d;long long s=0;for(int i=head[u];i;i=next[i]){s+=sum[i]*(sum[u]-sum[i]);}s=s/2*(2*d+1);ans+=s;for(int i=head[u];i;i=next[i]){cnt(d+1,i);}return ans;}};Trie trie;int main() {int T=0;while(~scanf("%d",&n)&&n!=0){trie.clear();char s[maxm+5];for(int i=1;i<=n;i++){scanf("%s",s);trie.insert(s);}printf("Case %d: %lld\n",++T,trie.cnt(0,0));}return 0;}


阅读全文
'); })();
2 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 半粒糖,甜到伤 堆肥 堆肥箱 堆肥怎么做 堆肥桶 堆肥翻堆机 堆肥马桶 堆肥发酵剂 堆肥图片 厨余堆肥简单方法 家庭堆肥制作 堆肥发酵菌种 堆肥快速腐熟剂 堆肥发酵翻堆机 底部堆量选股公式 锦灰堆 笕堇 角堇 堇菜 濑堇 堇美香 堇怎么读 白石堇 水川堇 堇字取名寓意 薄少撒娇堇颜 水川堇在线播放 白石堇无法拒绝儿子 堇美香在线播放 白石堇中文字在线播放 堇美香在线 堇美香2018全部作品 濑户堇 水川堇全部作品 堇字在人名名寓意 堇青石 堇美香2019年全部作品 609黑堇川中字在线播放 非洲堇 堇色