題意:給定乙個串s,該串有strlen(s)個迴圈同構串,要求輸出字典序最小的同構串的下標,字典序最小的出現次數,最大的同構串的下標,字典中最大的出現次數。
思路:對於求迴圈同構的字典序最小可以用最小表示法求得,最大也是一樣。然後設ds為字串s+s。然後就可以用kmp求最小串在ds出現的次數和最大串出現的次數了。
#define _crt_secure_no_deprecate#include#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn = 1000000 + 5
;typedef
long
long
intll;
#define inf 0x3f3f3f3f
int representation(char *s,int l,bool flag)
else
else
}else
else
}if (i ==j)
k = 0
; }
}return i < j ?i : j;
}int
next[maxn];
void getnext(char *s,int lens)
else
}}int kmp_count(char *s,int lens,char *t,int lent)
if (s[i] ==t[j])
if (j ==lent)
}return
ans;
}char str[maxn], dstr[maxn*2
],minstr[maxn],maxstr[maxn];
//原串,原串*2後的串,字典序最小的串,字典序最大的串
intmain()
//計算最小
int minstart = representation(str, len,0
);
for (int i = 0; i < len; i++)
int mincount = kmp_count(dstr, len * 2 - 1
, minstr, len);
//計算最大
int maxstart = representation(str, len,1
);
for (int i = 0; i < len; i++)
int maxcount = kmp_count(dstr, len * 2 - 1
, maxstr, len);
printf(
"%d %d %d %d\n
", minstart + 1,mincount , maxstart + 1
, maxcount);
}return0;
}
HDU 3374(最小表示法)
題目鏈結 題意 給幾個字串,求每個字串的最小迴圈表示,最大迴圈表示 輸出序號最小的 以及出現的次數。思路 前面兩個直接用模板可求解。出現次數實際上就是問迴圈節的個數,這時我們可以想到kmp演算法中的nextval陣列。ac include include include includeusing n...
HDU 3374(最小表示法 最大表示法)
hdu3374 題意 給你乙個字串,問這個字串經過移動後的字典序最小的字串的首字元位置和字典序最大的字串的首字元的位置,和能出現多少次最小字典序的字串和最大字典序的字串 題解 利用最小表示法與最大表示法o n 複雜度求出最小字典序和最大字典序串出現位置,然後利用kmp求出next,利用next陣列性...
最小(大)表示法講解
參考文章 引子 首先有乙個字串s,我們可以對他進行操作,每次操作都可以將第乙個字元移動到最後乙個字元。我們要求解經過n次操作後,得到的字典序最小的字串是什麼。一.樸素演算法 樸素演算法利用兩個指標i,j。初始i 0,j 1。i 為最小的字串的開頭位置 a.當s i s j 時 i j 因為j是更小的...