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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

【POJ1509】Glass Beads 【后缀自动机】

發(fā)布時(shí)間:2023/11/27 生活经验 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【POJ1509】Glass Beads 【后缀自动机】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題意

? 給出一個(gè)字符串,求它的最小表示法。

分析

?這個(gè)題當(dāng)然可以用最小表示法做啦!但是我是為了學(xué)后綴自動(dòng)機(jī)鴨!

? 我們把這個(gè)字符串長(zhǎng)度乘二,然后建SAM,然后在SAM上每次跑最小的那個(gè)字母,找出長(zhǎng)度為n的時(shí)候就停下。如果停下的那個(gè)狀態(tài)時(shí)u,那么ans=st[u].len-n+1?

  

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <map>
 6 
 7 using namespace std;
 8 const int maxn=20000+100;
 9 char s[maxn];
10 int n,T;
11 struct state{
12     map<char,int>next;
13     int len,link;
14 }st[4*maxn];
15 int last,cnt,cur;
16 void init(){
17     last=cur=0;
18     cnt=1;
19     st[0].len=0;
20     st[0].link=-1;
21     st[0].next.clear();
22 }
23 void build(char c){
24     cur=cnt++;
25     st[cur].next.clear();
26     st[cur].len=st[last].len+1;
27     int p;
28     for(p=last;p!=-1&&!st[p].next.count(c);p=st[p].link)
29         st[p].next[c]=cur;
30     if(p==-1)
31         st[cur].link=0;
32     else{
33         int q=st[p].next[c];
34         if(st[p].len+1==st[q].len)
35             st[cur].link=q;
36         else{
37             int clone=cnt++;
38             st[clone].next=st[q].next;
39             st[clone].link=st[q].link;
40             st[clone].len=st[p].len+1;
41             for(;p!=-1&&st  [p].next[c]==q;p=st[p].link)
42                 st[p].next[c]=clone;
43             st[q].link=clone;st[cur].link=clone;
44         }
45     }
46     last=cur;
47 }
48 int main(){
49     scanf("%d",&T);
50     for(int t=1;t<=T;t++){
51         scanf("%s",s);
52         n=strlen(s);
53         for(int i=0;i<n;i++)
54             s[i+n]=s[i];
55         init();
56         for(int i=0;i<n;i++)
57             build(s[i]);
58         for(int i=n;i<2*n;i++)
59             build(s[i]);
60         int u=0;
61         for(int i=0;i<n;i++){
62             for(int j='a';j<='z';j++){
63                 if(st[u].next.count(j)){
64                     u=st[u].next[j];
65                     break;
66                 }
67             }
68         }
69         int ans=st[u].len-n+1;
70         printf("%d\n",ans);
71     }
72 return 0;
73 }
View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/LQLlulu/p/9882133.html

總結(jié)

以上是生活随笔為你收集整理的【POJ1509】Glass Beads 【后缀自动机】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。