日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash)

發布時間:2023/10/11 综合教程 83 老码农
生活随笔 收集整理的這篇文章主要介紹了 HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Reincarnation

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)

Problem Description
Now you are back,and have a task to do:
Given you a string s consist of lower-case English letters only,denote f(s) as the number of distinct sub-string of s.
And you have some query,each time you should calculate f(s[l...r]), s[l...r] means the sub-string of s start from l end at r.
 
Input
The first line contains integer T(1<=T<=5), denote the number of the test cases.
For each test cases,the first line contains a string s(1 <= length of s <= 2000).
Denote the length of s by n.
The second line contains an integer Q(1 <= Q <= 10000),denote the number of queries.
Then Q lines follows,each lines contains two integer l, r(1 <= l <= r <= n), denote a query.
 
Output
For each test cases,for each query,print the answer in one line.
 
Sample Input
2
bbaba
5
3 4
2 2
2 5
2 4
1 4
baaba
5
3 3
3 4
1 4
3 5
5 5
 
Sample Output
3
1
7
5
8
1
3
8
5
1

Hint

I won't do anything against hash because I am nice.Of course this problem has a solution that don't rely on hash.

 

題意:

  給你一個母串,

  Q個詢問,每次詢問你[L,R] 屬于這一段中不同子串的個數是多少

題解:

  考慮離線

  把詢問縮小,相同L的詢問劃分為一類

  這樣最多就是建立 2000 個后綴自動機了

#include <bits/stdc++.h>
inline long long read(){long long x=,f=;char ch=getchar();while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}return x*f;}
using namespace std; const int N = 2e3+; const long long mod = ; long long now;
int isPlus[N * ],endpos[N * ];int d[N * ];
int tot,slink[*N],trans[*N][],minlen[*N],maxlen[*N],pre;
int newstate(int _maxlen,int _minlen,int* _trans,int _slink){
maxlen[++tot]=_maxlen;minlen[tot]=_minlen;
slink[tot]=_slink;
if(_trans)for(int i=;i<;i++)trans[tot][i]=_trans[i],d[_trans[i]]+=;
return tot;
}
long long update(int u) {
return 1LL*(maxlen[u] - minlen[u] + );
}
int add_char(char ch,int u){
int c=ch-'a',v=u;
int z=newstate(maxlen[u]+,-,NULL,);
isPlus[z] = ;
while(v&&!trans[v][c]){trans[v][c]=z;d[z]+=;v=slink[v];}
if(!v){ minlen[z]=;slink[z]=;now += update(z);return z;}
int x=trans[v][c];
if(maxlen[v]+==maxlen[x]){slink[z]=x;minlen[z]=maxlen[x]+;now += update(z);return z;}
int y=newstate(maxlen[v]+,-,trans[x],slink[x]);
now -= update(x);
slink[z]=slink[x]=y;minlen[x]=minlen[z]=maxlen[y]+;
now += update(x);
while(v&&trans[v][c]==x){trans[v][c]=y;d[x]--,d[y]++;v=slink[v];}
minlen[y]=maxlen[slink[y]]+;
now += update(y);now += update(z);
return z;
}
void init_sam() {
for(int i = ; i <= tot; ++i)
for(int j = ; j < ; ++j) trans[i][j] = ;
pre = tot = ; }
int T,n;
long long ans[];
char a[N * ];
struct ss{int L,R,id;}Q[];
int cmp(ss s1,ss s2) {
if(s1.L == s2.L)return s1.R < s2.R;
return s1.L < s2.L;
}
int main() {
scanf("%d",&T);
while(T--) {
scanf("%s%d",a+,&n);
for(int i = ; i <= n; ++i)
scanf("%d%d",&Q[i].L,&Q[i].R),Q[i].id = i;
sort(Q+,Q+n+,cmp);
int l = ,r = ;
for(int i = ; i <= n; ++i) {
if(Q[i].L != Q[i-].L) {init_sam();
l = Q[i].L,r = l-;
now = ;
}
while(r < Q[i].R){
pre = add_char(a[(++r)],pre);
}
ans[Q[i].id] = now;
}
for(int i = ; i <= n; ++i) printf("%lld\n",ans[i]);
}
return ;
}

BKDRHash

#include <cstdio>
#include <cstdlib>
#include <cstring>
typedef unsigned long long int ULL;
//BKDRHash,最優的字符串hash算法。hash一開始是等于0的
const int seed = ; // 31 131 1313 13131 131313 etc..
const int maxn = +;
char str[maxn];
ULL powseed[maxn]; // seed的i次方 爆了也沒所謂,sumHash的也爆。用了ULL,爆了也沒所謂,也能唯一確定它,無符號
ULL sumHash[maxn]; //前綴hash值
int ans[maxn][maxn]; //ans[L][R]就代表ans,就是區間[L,R]內不同子串的個數
const int MOD = ;
struct StringHash
{
int first[MOD+],num;
ULL EdgeNum[maxn]; // 表明第i條邊放的數字(就是sumHash那個數字)
int next[maxn],close[maxn]; //close[i]表示與第i條邊所放權值相同的開始的最大位置
//就比如baba,現在枚舉長度是2,開始的時候ba,close[1] = 1;表明"ba"開始最大位置是從1開始
//然后枚舉到下一個ba的時候,close[1]就要變成3了,開始位置從3開始了
void init ()
{
num = ; memset (first,,sizeof first);
return ;
}
int insert (ULL val,int id) //id是用來改變close[]的
{
int u = val % MOD;
for (int i = first[u]; i ; i = next[i]) //存在邊不代表出現過,出現過要用val判斷,val才是唯一的,邊還是壓縮后(%MOD)的呢
{
if (val == EdgeNum[i]) //出現過了
{
int t = close[i]; close[i] = id;//更新最大位置
return t;
}
}
++num; //沒出現過的話,就加入圖吧
EdgeNum[num] = val; // 這個才是精確的
close[num] = id;
next[num] = first[u];
first[u] = num;
return ;//沒出現過
}
}H;
void work ()
{
scanf ("%s",str+);
int lenstr = strlen(str+);
for (int i=;i<=lenstr;++i)
sumHash[i] = sumHash[i-]*seed + str[i];
memset(ans,,sizeof(ans));
for (int L=;L<=lenstr;++L) //暴力枚舉子串長度
{
H.init();
for (int i=;i+L-<=lenstr;++i)
{
int pos = H.insert(sumHash[i+L-]-powseed[L]*sumHash[i-],i);
ans[i][i+L-] ++;//ans[L][R]++,自己是一個
ans[pos][i+L-]--;//pos放回0是沒用的 }
}
for (int i = lenstr; i>=; i--)
{
for (int j=i;j<=lenstr;j++)
{
ans[i][j] += ans[i+][j]+ans[i][j-]-ans[i+][j-];
}
}
int m;
scanf ("%d",&m);
while (m--)
{
int L,R;
scanf ("%d%d",&L,&R);
printf ("%d\n",ans[L][R]);
}
return ;
}
int main ()
{
powseed[] = ;
for (int i = ; i <= maxn-; ++i) powseed[i] = powseed[i-] * seed;
int t;
scanf ("%d",&t);
while (t--) work();
return ;
}

總結

以上是生活随笔為你收集整理的HDU 4622 Reincarnation 后缀自动机 // BKDRHash(最优hash)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色婷婷激情综合 | 欧美综合网站 | 久久久国产精品人人片 | 天天射干| 999毛片 | 91精品国产aⅴ一区二区 | 午夜片在线 | exo妈妈mv在线播放高清免费 | 国内成人在线 | 亚洲美女福利 | 爱豆国产剧免费观看大全剧集 | 国产亚洲自拍一区 | 蜜臀麻豆 | 五月天婷婷网站 | 欧美色哟哟 | 亚洲一区色 | 干干干日日日 | 和黑帮大佬的365 | 无码精品一区二区三区AV | www.欧美激情| 国产一区二区三区影院 | 国产精品第六页 | 无码粉嫩虎白一线天在线观看 | av中文字幕在线看 | 国产乱子一区二区 | 国产午夜无码精品免费看奶水 | 超碰97观看 | 中文一级片 | 香蕉大久久 | 人人草人人看 | 免费在线观看视频a | 69精品无码成人久久久久久 | 99国产精 | 撒尿free性hd| 逼逼爱插插网站 | 3d毛片 | 精品久久久久久亚洲 | 欧美一区二区免费视频 | 午夜高潮视频 | 黄色免费一级视频 | 欧美xxx性 | 欧美性粗暴 | 一区二区三区免费在线视频 | a级片一级片 | 人人妻人人澡人人爽久久av | 成人av激情 | 中日韩男男gay无套 人人草人人干 | 爱爱视频网站免费 | 七月婷婷综合 | 天堂欧美城网站网址 | 欧美综合另类 | 欧美另类69 | 中国av一区二区 | 亚洲第一视频区 | 日韩大片免费观看 | www.麻豆av.com| 久久网一区 | 欧美日韩国产精品成人 | 一区二区三区少妇 | 华人在线视频 | 色综合自拍 | 91tv国产成人福利 | a猛片 | 天堂视频在线观看免费 | 久草热在线 | zoo性欧美 | 黄色三级小说 | 激情久久五月天 | 国产成人短视频在线观看 | 香蕉网站在线观看 | 秋霞毛片| 四虎成人精品永久免费av九九 | 新婚之夜玷污岳丰满少妇在线观看 | 曰本三级日本三级日本三级 | 国产真人无码作爱视频免费 | 成人香蕉网 | 亚洲天堂91| 猛男大粗猛爽h男人味 | 男人天堂avav | 理论片第一页 | 一区国产在线 | 亚洲成人精品在线 | 亚洲图片在线视频 | 国产精品主播视频 | 色丁香婷婷综合久久 | 久久久久久久久久久久久久久 | 日本精品在线一区 | 国产高清视频一区 | 精彩毛片| 精品一区二区三区视频在线观看 | 色久阁| 操操综合| 精品人伦一区二区三 | av在线免费播放网址 | 森泽佳奈中文字幕 | 免费看黄的网址 | 色欲久久久天天天综合网精品 | 制服丝袜在线看 | 国产高中女学生第一次 |