| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:codeforces上测的 单case 500ms 居然还是TLE...In Reply To:Re:codeforces上测的 单case 500ms 居然还是TLE... Posted by:Los_Angelos_Laycurse at 2016-12-23 15:20:06 > AC ..IN C++..
>
> haha...
贴一个庆祝一下 6000+ms
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#pragma GCC optimize (2)
using namespace std;
const double eps=1e-9;
const int mod=7;
const int inf=1e9+9,add=15000;
int dp[mod][30001],ans,pre[30001];
int mat[4][4]={{0,5,5,5},{5,0,4,5},{5,4,0,5},{5,5,5,0}};
char ch[]={'A','G','C','T'};
int pos[128],len[2];
char str[2][55555];
int main()
{
int i,j,s,p,q,cost,low,high;
for(i=0;i<4;i++)
pos[ch[i]]=i;
while(scanf("%s%s",str[0],str[1])==2)
{
len[0]=strlen(str[0]);
len[1]=strlen(str[1]);
if(len[0]<len[1])
{
swap(len[0],len[1]);
for(j=0;j<max(len[0],len[1]);j++)
swap(str[0][j],str[1][j]);
}
int vl=(int)(0.45*(len[0]+len[1])+1-eps);
ans=3*(len[0]-vl+len[1]-vl);
int dm=len[0]-len[1];
int flag=3*dm%mod;
memset(dp,-1,sizeof(dp));
dp[flag][add]=0;
memset(pre,-1,sizeof(pre));
for(cost=3*dm;cost<=ans;cost++)
{
int low,high,nflag;
if(cost+mod-1<=ans)
{
nflag=(flag+mod-1)%mod;
low=(3*dm-(cost+mod-1))/6;
high=(3*dm+cost+mod-1)/6;
for(j=low;j<=high;j++)
dp[nflag][j+add]=-1;
}
low=(3*dm-cost)/6;
high=(3*dm+cost)/6;
for(j=high;j>dm;j--)
{
int nflag,nj=dp[flag][j+add]-j,ni=dp[flag][j+add];
if(pre[j+add]>=ni)
continue;
while(ni<len[0]&&nj<len[1]&&str[0][ni]==str[1][nj])
{
ni++;
nj++;
}
pre[j+add]=ni;
if(ni>=len[0]&&nj>=len[1])
{
ans=cost;
goto orz;
}
if(ni+1<=len[0]&&nj+1<=len[1])
{
nflag=flag+mat[pos[str[0][ni]]][pos[str[1][nj]]];
if(nflag>=mod)
nflag-=mod;
if(dp[nflag][j+add]<ni+1)
dp[nflag][j+add]=ni+1;
}
if(ni+1<=len[0])
{
if(pre[ni+1-nj+add]<ni+1)
{
nflag=(flag+6);
if(nflag>=mod)
nflag-=mod;
if(dp[nflag][ni+1-nj+add]<ni+1)
dp[nflag][ni+1-nj+add]=ni+1;
}
}
if(nj+1<=len[1])
{
if(pre[ni-nj-1+add]<ni)
{
if(dp[flag][ni-nj-1+add]<ni)
dp[flag][ni-nj-1+add]=ni;
}
}
}
for(j=low;j<=dm;j++)
{
if(dp[flag][j+add]<0)
continue;
int nflag,nj=dp[flag][j+add]-j,ni=dp[flag][j+add];
if(pre[j+add]>=ni)
continue;
while(ni<len[0]&&nj<len[1]&&str[0][ni]==str[1][nj])
{
ni++;
nj++;
}
pre[j+add]=ni;
if(ni>=len[0]&&nj>=len[1])
{
ans=cost;
goto orz;
}
if(ni+1<=len[0]&&nj+1<=len[1])
{
nflag=flag+mat[pos[str[0][ni]]][pos[str[1][nj]]];
if(nflag>=mod)
nflag-=mod;
if(dp[nflag][j+add]<ni+1)
dp[nflag][j+add]=ni+1;
}
if(ni+1<=len[0])
{
if(pre[ni+1-nj+add]<ni+1)
{
nflag=flag;
if(j==dm)
{
nflag=(flag+6);
if(nflag>=mod)
nflag-=mod;
}
if(dp[nflag][ni+1-nj+add]<ni+1)
dp[nflag][ni+1-nj+add]=ni+1;
}
}
if(nj+1<=len[1])
{
if(pre[ni-nj-1+add]<ni)
{
nflag=(flag+6);
if(nflag>=mod)
nflag-=mod;
if(dp[nflag][ni-nj-1+add]<ni)
dp[nflag][ni-nj-1+add]=ni;
}
}
}
flag=(flag+1)%mod;
}
orz:
printf("%d\n",ans);
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator