p1470 Longest Prefix

时间:2023-03-09 15:42:32
p1470 Longest Prefix

原本就想到dp,可是是我的思路是在串的各个位置都遍历一次set,看dp[i-st[k]]是否为1且前length(st[k])是st[k]。这样200000*200*10会超时。更好的办法是在i位取前len<=10个看dp[]和set中是否存在。只要200000*55*log200。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <iomanip>
#include <cstring>
#include <map>
#include <queue>
#include <set>
#include <cassert>
#include <stack>
#include <bitset>
#define mkp make_pair
using namespace std;
const double EPS=1e-;
typedef long long lon;
const lon SZ=,INF=0x7FFFFFFF;
set<string> st;
string str;
int arr[SZ]; void init()
{
for(;;)
{
string tmp;
cin>>tmp;
if(tmp==".")break;
st.insert(tmp);
}
string tmp;
for(;cin>>tmp;)
{
str+=tmp;
}
} void work()
{
int res=;
for(int i=;i<str.size();++i)
{
for(int j=;j<=;++j)
{
if(i-j-<||arr[i-j-])
{
string tmp=str.substr(max(,i-j),min(i+,j+));
//if(i==6)cout<<j<<" "<<tmp<<" "<<(st.find(tmp)!=st.end())<<endl;
if(st.find(tmp)!=st.end())
{
arr[i]=;
//cout<<i<<" "<<"here"<<endl;
break;
}
}
}
if(arr[i]==)
{
res=i+;
}
}
cout<<res<<endl;
} int main()
{
std::ios::sync_with_stdio();
//freopen("d:\\1.txt","r",stdin);
lon casenum;
//cin>>casenum;
//for(lon time=1;time<=casenum;++time)
{
init();
work();
}
return ;
}