時間限制:
1000ms
記憶體限制:
65536kb 描述
輸入輸入資料報括多組,每組為乙個全部由小寫字母組成的不含空格的使用者請求(字串),佔一行。使用者請求的長度不大於100,000。
最後一行輸入為#,作為結束的標誌。
輸出對於每組輸入,先輸出這個組的編號(第n組就是輸出「case n:」);然後輸出這組使用者請求中迴圈節最多的子串。如果乙個使用者請求中有兩個迴圈節數相同的子串,請選擇那個字典序最小的。
樣例輸入
ilovejohnsonjohnsonverymuchduckduckgo
aaabbbcccisagoodcompany
#
樣例輸出
case 1: johnsonjohnsoncase 2: duckduck
case 3: aaa
#include#include#include#includeusing namespace std;
const int maxn=100010;
const int inf=5000000;
int w[maxn],wa[maxn],wb[maxn],wv[maxn];
int sa[maxn],rank[maxn],height[maxn];
int a[maxn],f[maxn][20],n,ft[maxn],len[maxn];
int num;
char s[maxn];
int cmp(int *r,int a,int b,int l)
void da(int *r,int *sa,int n,int m)
x++;
int t=ft[y-x+1];
return nmin(f[x][t],f[y-(1<=0&&k%l!=0)
if (lcp(t,t+l)>=k) r++;
if (r>max)
else
if(r==max)
//printf("l=%d r=%d i=%d i+l=%d/n",l,r,i,i+l);
}// printf("%d/n",max);
int start,l;
for(int i=1;i=(max-1)*tl)}}
printf("case %d: ", cas++);
for (int i = 0; i < l; i++) printf("%c", s[start+ i]);
cout<}
return 0;
}
百度之星資格賽
1001 給你1 n這n個數字,公升序排列,接下來按照陣列a進行位置變換,a i 代表第i個數字會變到a i 位置上,a中的數字也是從1 n。現在問有多少個不同的陣列能滿足做一次變換和做三次變換結果相同。我們可以這樣分析,x y是唯一的到y的途徑,假設x y為第一次變換,因此在第三次變換的時候任然為...
2012百度之星 資格賽 H 使用者請求中的品牌
時間限制 1000ms 記憶體限制 65536kb 描述 輸入 輸入資料報括多組,每組為乙個全部由小寫字母組成的不含空格的使用者請求 字串 佔一行。使用者請求的長度不大於100,000。最後一行輸入為 作為結束的標誌。輸出對於每組輸入,先輸出這個組的編號 第n組就是輸出 case n 然後輸出這組使...
2016 百度之星 資格賽
變懶了,最近做的很多題目都不想貼了。本來就sb,還那麼懶,沒救了。a沒想太多,設個逆元就過了。b斐波那契數列高精度。n 0時輸出換行。c字典樹,記錄結點的單詞數 以及 當前結點是否是單詞的末尾,delete時需要先找出字首對應的串數,那麼就dfs統計末尾結點總數,然後用字首減掉就好了。一開始dfs跑...