题目链接:CF 79C. Beaver
这道题目第一感觉就是贪心,不过贪心很容易wa的样子,我就是wa了好几次
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int inf=0x3fffffff;
char s[100010],b[10][12];
int far[100010];
int main()
{
int n;
while(scanf("%s%d",s,&n)==2)
{
for(int i=0;i<n;i++)
scanf("%s",b[i]);
int len=strlen(s);
fill(far,far+len,inf);
for(int i=0;i<n;i++)
{
int ln=strlen(b[i]);
for(int j=0;j+ln<=len;j++)
{
int r;
for(r=0;r<ln;r++)
if(s[j+r]!=b[i][r]) break;
if(r>=ln) far[j+ln-1]=min(far[j+ln-1],ln);
}
}
int pre=0,pos=0,ans=0;
for(int i=0;i<len;i++)
if(far[i]!=inf||i==len-1)
{
if(ans<i-pre+(far[i]>i-pre+1)) ans=i-pre+(far[i]>i-pre+1),pos=pre;
pre=max(pre,i-far[i]+2);
}
printf("%d %d\n",ans,pos);
}
return 0;
}
下面是dp,dp[ i ] 表示以第i个字符结尾的最长能记住的单词,我怎么感觉还是贪心呢
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
const int inf=0x3fffffff;
char s[100010],b[10][12];
int far[100010],dp[100010];
int main()
{
int n;
while(scanf("%s%d",s,&n)==2)
{
for(int i=0;i<n;i++) scanf("%s",b[i]);
int len=strlen(s);
fill(far,far+len,inf);
for(int i=0;i<n;i++)
{
int ln=strlen(b[i]);
for(int j=0;j+ln<=len;j++)
{
int r;
for(r=0;r<ln;r++)
if(s[j+r]!=b[i][r]) break;
if(r>=ln) far[j+ln-1]=min(far[j+ln-1],ln);
}
}
//for(int i=0;i<len;i++) cout<<s[i]<<" "<<far[i]<<endl;
dp[0]= (far[0]==inf);
int ans=dp[0],pos=0,pre=0;
for(int i=1;i<len;i++)
{
if(far[i]>i-pre+1) dp[i]=dp[i-1]+1;
else dp[i]=min(far[i]-1,i-pre),pre=max(pre,i-far[i]+2);
if(ans<dp[i]) ans=dp[i],pos=i-dp[i]+1;
}
cout<<ans<<" "<<pos<<endl;
}
return 0;
}