HDU 5384 Danganronpa (2015年多校比赛第8场)
生活随笔
收集整理的這篇文章主要介紹了
HDU 5384 Danganronpa (2015年多校比赛第8场)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.題目描寫敘述:點擊打開鏈接
2.解題思路:本題利用字典樹解決。本題要求查找全部的B[j]在A[i]中出現的總次數。那么我們能夠建立一顆字典樹,將全部的B[j]插入字典樹,因為一個串的全部字串相當于它全部后綴的前綴。
因此在查找時候,僅僅須要查找A[i]的每個后綴就可以,然后累加這個后綴的前綴個數,就可以得到該后綴中子串的個數。全部后綴的值相加,就是終于的答案。
3.代碼:
#pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<algorithm> #include<cassert> #include<string> #include<sstream> #include<set> #include<vector> #include<stack> #include<map> #include<queue> #include<deque> #include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<ctime> #include<cctype> #include<functional> using namespace std;typedef long long ll; typedef unsigned int uint; typedef unsigned long long ull; typedef pair <int, int> P;const int N=100000+10; int n,m; char A[N][10005]; char B[N]; struct Trie {int tree[N][26],val[N],cnt;Trie(){init();}void init(){cnt=1;memset(tree,0,sizeof(tree));}void insert(char*s){int p=0,l=strlen(s);for(int i=0;i<l;i++){int a=s[i]-'a';if(!tree[p][a]){val[cnt]=0;tree[p][a]=cnt++;}p=tree[p][a];}++val[p];}int query(char*s){int p=0,l=strlen(s),ans=0;for(int i=0;i<l;i++){int a=s[i]-'a';if(!tree[p][a])return ans;p=tree[p][a];ans+=val[p];}return ans;} }T;int main() {int t;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);T.init();for(int i=0;i<n;i++)scanf("%s",A[i]);ll ans;for(int i=0;i<m;i++){scanf("%s",B);T.insert(B);//將全部的B[j]插入字典樹}for(int i=0;i<n;i++){ans=0;int l=strlen(A[i]);for(int j=0;j<l;j++)ans+=T.query(A[i]+j);//枚舉后綴的前綴在字典樹中出現多少次,得到該后綴的返回值,累加就是答案printf("%I64d\n",ans);}} }總結
以上是生活随笔為你收集整理的HDU 5384 Danganronpa (2015年多校比赛第8场)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《ES6标准入门》49~68Page 数
- 下一篇: BZOJ 4827 [Hnoi2017]