把每天想熬夜的心,放在平时只争朝夕,精密计划,商鞅变法,公牛母牛上,而不是用熬夜拼命获得对自己的认同感。
复习前一天的博客很重要,想尽办法做一切有利于自己理解的模板,别人的写法只是领进门,自己对变量名、写法进行整合,才是在个人。
1.牛客网真是好网站啊,发帖是会有人回的
找的代码先测试下性能和空间。确认通过再学习,防止做无用功
2.KMP主要是利用字符串前后串相同的地方减少从头比较造成的问题
BONUS:
<1> next是C++关键字,用来命名变量会报错
<2> 两数相减算下标 i-j+1,是否加1很关键
KMP板子
#include<bits/stdc++.h> using namespace std; int a[1000111]; int b[10011]; int next1[10011]; //substring length==len void getnext(int len) { int i=0,j=-1; next1[0]=-1; while(i<len) { if(j==-1||b[i]==b[j]) { i++; j++; next1[i]=j; } else j=next1[j]; } } int kmp(int n,int m) { int i=0,j=0; while(i<n&&j<m) { //during while loop only can change index i ,j if(j==-1||a[i]==b[j]) { i++;j++; } else j=next1[j]; } if(j==m) return i-j+1; else return -1; } int main() { ios::sync_with_stdio(false); freopen("a.out","r",stdin); int T,m,n; cin>>T; while(T--) { cin>>m>>n; if(m<n) { cout<<"-1"<<endl; continue; } for(int i=0;i<m;++i) cin>>a[i]; for(int j=0;j<n;++j) cin>>b[j]; getnext(n); cout<<kmp(m,n)<<endl; } return 0; }
AC自动机写了好几天
用自己的话讲出来说明真懂,能举出合适的例子也是一样。
4.a&b循环同构:
把string a的第一位移到最后,多次这样操作,能得到string b
eg:abcab
bcaba cabab ababc babca abcab
qwer
werq erqw rqwe qwer
5.字符串hash
字符串中每种元素的值要尽量从1开始,若从0,比如a=0,b=1,ab与b便都是1
使用前要加ios:: 才行 ios::sync_with_stdio 解绑stdio 从此后不能混用printf和cout
cin.tie(0)解绑cin和cout会加速
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ull; const int N=2e6+5; unordered_map<ull,int> mp; string t,s; int n,m,k; ull h[N],P,p=197; ull get(int l,int r) { return h[r]-h[l-1]*P; } int main() { //input string t,number n,and n number string freopen("a.in","r",stdin); ios::sync_with_stdio(false); cin.tie(0); cin>>t>>n; P=1,m=t.size(); t=' '+t+t; for(int i=1;i<=m;++i) { t[i+m]=t[i]; P*=p; } for(int i=1;i<=2*m;++i) { h[i]=h[i-1]*p+t[i]; if(i>=m) mp[get(i-m+1,i)]=1; } while(n--) { cin>>s; k=s.size();s=' '+s; int ans=0; for(int i=1;i<=k;++i) h[i]=h[i-1]*p+s[i]; for(int i=m;i<=k;++i) ans+=mp.count(get(i-m+1,i)); cout<<ans<<endl; } return 0; }
3.朗朗的自传可以给人指导和力量
愿为天下目,萃聚六路华
浙公网安备 33010602011771号