1.上午(2h)
写出了两道题(map是个好东西)
P3370 【模板】字符串哈希 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
P2957 [USACO09OCT]Barn Echoes G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
2.下午加晚上(7h)
写出了一道题
P1102 A-B 数对 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
最后一道题写了我将近快6个小时。。。我真的心态崩了.
最后还是看了同学的代码有了点启发,感觉懂了但是又说不出来。。。
#include<bits/stdc++.h>
using namespace std;
int n;
string s,ans;
int nxt[1000011];
void Next(string s)//kmp算法
{
int j=0;
int l=s.size();
s=' '+s;
for(int i=2; i<=l; i++)
{
while(s[j+1]!=s[i]&&j)
j=nxt[j];
if(s[j+1]==s[i])
j++;
nxt[i]=j;
}
}
int main()
{
ios::sync_with_stdio(false);//加快cin的速度
cin>>n;
cin>>ans;
for(int i=2; i<=n; i++)
{
cin>>s;
int ln=min(s.size(),ans.size());//算出长度可以减少kmp运算次数
string ss=s+'#'+ans.substr(ans.size()-ln,ln);//他说这里得加一个符号隔开
Next(ss);
for(int j=nxt[ss.size()]; j<s.size(); j++)
ans+=s[j];
}
cout<<ans;
}
tip:substr(a,b)从一个字符串的下标a往后b位给截出来。
size应该都知道,算出字符串的长度
cin>>(a+1)就是让字符串的下标从0开始变成了从1开始(自己做题感觉的不知道是不是对的)