把每天想熬夜的心,放在平时只争朝夕,精密计划,商鞅变法,公牛母牛上,而不是用熬夜拼命获得对自己的认同感。

复习前一天的博客很重要,想尽办法做一切有利于自己理解的模板,别人的写法只是领进门,自己对变量名、写法进行整合,才是在个人。

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.朗朗的自传可以给人指导和力量

 

 

 

 

 

 

 

 

posted on 2020-03-05 11:25  黑暗尽头的超音速炬火  阅读(187)  评论(0)    收藏  举报