你面对以希望为名的绝望微笑
Description
盡管Murphyc趕在學級裁判開始前進入了未來機關的控制室,但學級裁判已經被設置為不可中斷.
雖然之前利用魔法修改識別碼時已經盡量減少魔力消耗,但此刻魔力仍是所剩無幾。Murphyc無力地坐到了地上,眼睜睜的看著Chiaki被處以“學級裁判”.
Chiaki在彌留之際:
? ? ? ? ? ? ? ? ? ? ? ? ? ?私の方こそ???ありがとう
? ? ? ? ? ? ? ? ? ? ? ? ? ?みんなの事???忘れないよ???
? ? ? ? ? ? ? ? ? ? ? ? ? ?ずっとずっと???忘れないよ???
? ? ? ? ? ? ? ? ? ? ? ? ? ?この先も???どこかでみんなの事を応援しているからね
? ? ? ? ? ? ? ? ? ? ? ? ? ?だって???ずっと仲間だもん
? ? 傷心欲絕的Murphyc一個人帶著Chiaki最后的話語離開了未來機關。
? ? 盡管Murphyc從絕望殘黨手中逃脫,但是他發現Chiaki最后的錄音被絕望所污染,為了恢復錄音,Murphyc需要知道被污染的錄音的最長未被污染音段,他很快解決了這個問題,回歸了原來的世界.
? ? Murphyc的故事到此結束,但是ACMer的問題并沒有解決,給你兩個串(僅由小寫字母組成),請問最長公共子串的長度.
Input
第一行輸入長度不超過3e5的串s1
第二行輸入長度不超過3e5的串s2
Output
最長公共子串(Longest Common Substring)的長度
若不存在LCS,輸出0
Sample Input
watashinokatakosoarigato minnanokotowasurenaiyoSample Output
3題解:
后綴自動機(SAM)裸題,具體解釋可以看如下
其實吧后綴數組(SA)利用height[]也可以解決這個問題,不過DA的SA肯定會被卡常,DC3的應該卡不到,但其實我造的數據還蠻水的hhh
不會SAM的建議先學AC自動機了解一下自動機理論還有SA,最后再去學SAM.
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=3e5+5; inline int read() {char ch=getchar();int i=0,f=1;while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){i=(i<<3)+(i<<1)+ch-'0';ch=getchar();}return i*f; } struct SAM {static const int KN = N << 1;static const int KM = 27;int fail[KN], net[KN][KM], len[KN], cnt, root;int rig[KN],sum[KN];int newnode(int _len){memset(net[cnt], -1, sizeof(net[cnt])); // fail[cnt] = -1;len[cnt] = _len;return cnt++;}void init(){cnt = 0;memset(fail,-1,sizeof(fail));root = newnode(0);}int add(int p, int x)//u--np,v---p{int np=newnode(len[p]+1);rig[np]=1;while(~p && net[p][x] == -1) net[p][x] = np, p = fail[p];if(p == -1) fail[np] = root;else{int q = net[p][x];if(len[q] == len[p] + 1) fail[np] = q;else{int nq = newnode(len[p] + 1);memcpy(net[nq], net[q], sizeof(net[q]));fail[nq] = fail[q];fail[q] = fail[np] = nq;while(~p && net[p][x] == q) net[p][x] = nq, p = fail[p];}}return np;}void build(char* s, char ch){int now = root;for(int i = 0; s[i]; ++i) now = add(now, s[i] - ch);}int ord[KN], pri[KN];void topo(){int maxVal=0;memset(pri, 0, sizeof(pri));for (int i = 0; i < cnt; ++i) maxVal = max(maxVal, len[i]), ++ pri[len[i]];for (int i = 1; i <= maxVal; ++i) pri[i] += pri[i - 1];for (int i = 0; i < cnt; ++i) ord[--pri[len[i]]] = i;}void gao(int k){topo();} } sam; char s[N]; char ss[N]; int main() {freopen("stdin.txt","r",stdin);freopen("stdout.txt","w",stdout);scanf("%s",s);scanf("%s",ss);int len1,len2;len1=strlen(s),len2=strlen(ss);sam.init();sam.build(s,'a');sam.topo();int cnt=0,pos=0,ans=0;for(int i=0; i<strlen(ss); i++){while(~pos&&sam.net[pos][ss[i]-'a']==-1) pos=sam.fail[pos];if(pos==-1) pos=0,cnt=0;else cnt=min(sam.len[pos],cnt)+1,pos=sam.net[pos][ss[i]-'a'],ans=max(ans,cnt);}printf("%d\n",ans); }?
總結
以上是生活随笔為你收集整理的你面对以希望为名的绝望微笑的全部內容,希望文章能夠幫你解決所遇到的問題。