利用失配陣列nxt
最長的乙個「前字尾」是1~nxt[n],那麼下乙個是多少?
#includeusingnamespace
std;
#define rg register
const
int n=1000000+5,m=10000+5,inf=0x3f3f3f3f,p=99999997
;int
l,j,cnt,nxt[n],ans[n];
char
s[n];
intmain()
int pos=l;
while
(nxt[pos])
ans[++cnt]=nxt[pos],pos=nxt[pos];
for(int i=cnt;i;--i) printf("
%d "
,ans[i]);
printf(
"%d\n
",l);
}return0;
}
給定乙個字串,求它最短的迴圈節長度
考慮n-next[n]與n的關係
若n不是n-next[n]的倍數,如何證明最短迴圈節長度只能是1
假設s的長度為len,則s存在最小迴圈節,迴圈節的長度l為len-next[len],子串為s[0…len-next[len]-1]。
(1)如果len可以被len - next[len]整除,則表明字串s可以完全由迴圈節迴圈組成,迴圈週期t=len/l。
(2)如果不能,說明還需要再新增幾個字母才能補全。需要補的個數是迴圈個數l-len%l=l-(len-l)%l=l-next[len]%l,l=len-next[len]。
#include #include#include
#include
using
namespace
std;
#define rg register
const
int n=1000000+5,m=10000+5,inf=0x3f3f3f3f,p=99999997
;int
t,n,l,j,nxt[n],ans[n];
char
s[n];
intmain()
l=n-nxt[n];
if(n%l) puts("1"
);
else printf("
%d\n
",n/l);
}return0;
}
給定乙個r*c的二維矩陣,其中c<= 75,求面積最小的長方形生成單元
例如:ababa
ababa
則答案為2,即ab
思路:對每一維分別做一次kmp,在做這一維時,將另一維整體看成字元
一維情況下,答案是n-next[n]
二維情況下,答案是(r-next[r])*(c-next[c])
#include #include#include
#include
using
namespace
std;
#define max(x,y) (x)>(y)?(x):(y)
#define min(x,y) (x)>(y)?(y):(x)
#define ll long long
#define rg register
const
int n=10000+5,m=10000+5,inf=0x3f3f3f3f,p=99999997
;int r,c,w=0,h=0
,nxt[n],ans[n];
char
s[n][n];
int kmp(int pos,int
flag)
return c-nxt[c];
}else
return r-nxt[r];
}}int
main()
一些字串函式
1.right location,somenumber left location,somenumber select right location,2 from my contacts 返回location列中所有右數兩個字元 select left location,2 from my cont...
字串的一些知識
1.string轉換成整數 string a 123 integer.parseint a throws numberformatexception integer.valueof a 呼叫parseint 丟擲異常同上 integer.valueof 8 56 而不是預想的8 可以用 8 0 2....
關於字串的一些。。。
首先呼叫這些函式需要使用標頭檔案include 1 des src abcd xyz abcdxyz char mystrcat char des,const char src 字串連線 2 字串比較 0,0,0 int mystrcmp const char str1,const char str...