description
xx在進行字串研究的時候,遇到了乙個十分棘手的問題。
在這個問題中,給定乙個字串s,與乙個整數k,定義s的子串t=s(i, j)是關於第k位的識別子串,滿足以下兩個條件:
1、i≤k≤j。
2、子串t只在s中出現過一次。
例如,s=」banana」,k=5,則關於第k位的識別子串有」nana」,」anan」,」anana」,」nan」,」banan」和」banana」。
現在,給定s,xx希望知道對於s的每一位,最短的識別子串長度是多少,請你來幫助他。
input
僅一行,輸入長度為n的字串s。
output
輸出n行,每行乙個整數,第i行的整數表示對於第i位的最短識別子串長度。
sample input
agoodcookcooksgoodfood
sample output
1 2
3 3
2 2
3 3
2 2
3 3
2 1
2 3
3 2
1 2 3 4
hint
n<=5*10^5
題解 只出現一次就是字尾自動機中right=1的串。
字尾自動機中某個狀態串表示[l,r-x]的範圍
於是我們對[r-x,r]維護最小值f[i]
對[l,r-x]維護最小值f[i]=min(f[i],r-i)
記g[i]=f[i]+i
則維護最小值g[i]=min(g[i],r)
兩棵線段樹維護即可。
**
#include
#include
#include
#include
#define ll long long
#define mod 1000003
#define eps (1e-10)
#define inf 1000000000
using namespace std;
inline int
read()
while (ch>='0'&&ch<='9')
return
x*f;
}const int n=900005;
int trans[n][26],right[n],l[n],r[n],fa[n],t[500005],q[n];
intlast,cnt,s,n;
char s[n];
struct node
int mid=(l+r)>>1;
if (y
<=mid) modify(k<<1,l,mid,x,y,z);
else
if (x>mid) modify(k<<1|1,mid+1,r,x,y,z);
else modify(k<<1,l,mid,x,mid,z),modify(k<<1|1,mid+1,r,mid+1,y,z);
}int query(int k,int l,int r,int
x)
void build(int k,int l,int r,int f)
int mid=(l+r)>>1;
build(k<<1,l,mid,f);build(k<<1|1,mid+1,r,f);
}}t1,t2;
inline void add(int
x) }
}void pre()
}int main()
for (int i=1;i<=n;i++)
return
0;}
bzoj 2865 字串識別 字尾陣列 線段樹
在這個問題中,給定乙個字串s,與乙個整數k,定義s的子串t s i,j 是關於第k位的識別子串,滿足以下兩個條件 1 i k j。2 子串t只在s中出現過一次。例如,s banana k 5,則關於第k位的識別子串有 nana anan anana nan banan 和 banana 現在,給定s...
BZOJ3473 字串 廣義字尾自動機
今天主攻了下sam 好多東西以前都沒理解到 對於這道題 我們建乙個自動機存所有串 每個穿last從1開始 對於自動機上每個點額外記乙個cnt 表示能匹配到這個點的不同串個數 建完對每個串在自動機上匹配 把到的每個點x和par x par par x 的cnt 然後就從父親往兒子傳遞一下 這樣每個點i...
BZOJ 3473 字串 廣義字尾自動機
time limit 20 sec memory limit 256 mb submit 354 solved 160 submit status discuss 給定n個字串,詢問每個字串有多少子串 不包括空串 是所有n個字串中至少k個字串的子串?第一行兩個整數n,k。接下來n行每行乙個字串。一行...