A循环移位可得B <=等价于=> B是AA的子串
1. A循环移位得到的串都是串AA的子串,故B是AA的子串。
2. B是AA的子串,假设在A|A拼接处B被分成B1|B2,A的后半段是B1、前半段是B2,A=B2|B1,A循环移位可得B。
s=pattern*k <=等价于=> (s+s).find(s,1) < s.size()
设d=(s+s).find(s,1),则pattern=s.substr(0,d),k=s.size()/d。
想象将s串平移一小段后仍与原串重叠,平移距离就是pattern长d。
直观上,记两串s1|s2、平移距离d(对应模式子串P)、平移后两串s1'|s2':
1. s1'末尾的P==s2开头的P、故s1末尾的P==s1开头的P
2. s1'开头的P==s1第二个P、故s1开头的P==s1第二个P
3. s1'第二个P==s1第三个P、故s1第二个P==s1第三个P,以此类推...
联系:最短长度编码字符串
从目录结构串中找最长绝对路径
int lengthLongestPath(string input) {
istringstream iss(input);
string line;
stack<int> stk;
int ans = 0;
while (getline(iss, line)) { // 遍历\n每行路径,并将绝对路径长压栈
int indent = 0;
while (line[indent] == '\t') indent++;
while (stk.size() > indent) stk.pop(); // 父目录数等于缩进数
int filelen = line.size() - indent;
int pathlen = (stk.empty() ? 0 : stk.top() + 1) + filelen; // 1是分隔符长
stk.push(pathlen);
if (line.find(".") != string::npos) ans = max(ans, pathlen);
}
return ans;
}