tips:
1、尋找最大公共子串時,如果字符串可以旋轉但是不能反轉,考慮在每個字符串后重復一次自身,如 "abcd" 變為 "abcdabcd",這樣在用dp就可以了。
如何變環+拆環為鏈:
cin>>n>>m;//拆環為鏈,復制一遍字符串串 for(int i = 1; i <= n;++i){cin>>s[i];s[i]+=s[i];}
尋找最大公共子串:
int cal_lcs(string a,string b)
{a = " "+ a, b =" "+b;memset(f,0,sizeof f);//對f初始化int cnt = 0;for(int i = 1;i<=a.size();++i){for(int j = 1;j<=b.size();++j){if(a[i] == b[j]) f[i][j] = max(f[i][j],f[i-1][j-1]+1);cnt = max(cnt,f[i][j]);}}return cnt;
}
menset()
針對menset()函數做一個簡單的介紹
void *memset(void *str, int c, size_t n)
- 解釋:復制字符 c(一個無符號字符)到參數 str 所指向的字符串的前 n 個字符。
- 作用:是在一段內存塊中填充某個給定的值,它是對較大的結構體或數組進行清零操作的一種最快方法
- 頭文件:C中
#include<string.h>
,C++中#include<cstring>
注意!menset()賦值一般用于初始化,其按照字節進行復制,將參數轉化為二進制再填入!(int有四個字節,在轉成二進制再賦值的情況下可能會出問題)
因此在int類型的賦值中一般只能賦值為0或-1,不推薦其他值。
為地址str開始的n個字節賦值c,注意:是逐個字節賦值,str開始的n個字節中的每個字節都賦值為c。
(1) 若str指向char型地址,value可為任意字符值;
(2) 若str指向非char型,如int型地址,value的值只能是-1或0,因為-1和0轉化成二進制后每一位都是一樣的,設int型占4個字節,則-1=0XFFFFFFFF, 0=0X00000000。
memset初始化為無窮大
memset(a , 0x3f , sizeof a);