1. 程式人生 > >[ZJOI2013]麗潔體

[ZJOI2013]麗潔體

reg 是否 輸出 需要 自己 接下來 小學生 固定 OS

題目描述

平時的練習和考試中,我們經常會碰上這樣的題:命題人給出一個例句,要我們類比著寫句子。這種往往被稱為仿寫的題,不單單出現在小學生的考試中,也有時會出現在中考中。許多同學都喜歡做這種題,因為較其它題顯得有趣。仿寫的句子往往具有“A__B__C”的形式,其中A,B,C是給定的由一個或多個單詞組成的短句,空的部分需要學生填寫。當然,考試的時候空在那裏也是可以的。例如,“其實天不暗陰雲終要散,其實 ,其實 ,其實路不遠一切會如願,艱難困苦的日子裏我為你祈禱,請你保重每一天”。再比如,“見了大海的洶湧,沒見過大山的巍峨,真是遺憾;見了大山的巍峨,沒見過 ,還是遺憾。出發吧,永遠出發。 ,人有不老的心情。”

由於現在是網絡時代,我們不再只能仿寫命題人命的題,我們可以仿寫網上各種句子和段落。2011年3月26日,某人在博客上發布了的消息就惹來了很多人的仿寫。

很難過吧。。。考得完爆了。。。

。。。。。。其實也沒什麽可以說的。。。都是蒟蒻的借口罷了。。。

。。。自己果然還只是半吊子水平呢。。。。

。。。祝大家都能進省隊。。。其實只要不要有遺憾就好了呢。。。

雖然我很遺憾或許不能走下去了。。。。。

886

在網絡上廣泛流傳的仿寫,因為在某些地方有獨到之處,大都被命名為“某某體”。打開人人,刷新微博,你也能發現這樣和那樣的體,比如,對不起體,**說明他愛你體等等。金先生註意到了這一現象,他敏銳地認為這是一個很有價值的研究課題,於是就其展開研究,打算發一篇paper。由於在網上發消息,人們有了更大的靈活度,人們有時因為表達的需要,還往原本固定的A, B, C中添加一些修飾的詞語。這就給辨別一個句子或段落是否是另一個句子或段落的仿寫增加了困難。

金先生現在研究一種形如“A*B*C”的體作品,其中A, B, C分別是某個由若幹單詞組成的短句,*代表0個或多個單詞。他在網上找了大量的體作品,不過很多體作品不太合乎原作者的格式,也就是相當於在正規的體作品中插入了0個或多個單詞。

由於數據量太大,金先生無法一個一個看過去,於是想請你幫忙,去掉盡量少的單詞,使它成為指定的體。

輸入輸出格式

輸入格式:

包含4行。

第一行是某個也許不規範的體作品T,

接下來三行分別代表A, B, C。

輸出格式:

僅一行,包含一個數,即最少的去除單詞數。

輸入輸出樣例

輸入樣例#1: 復制
xiang yao yi zhi ai zhe mou wu de hua yi yao guai zhi si lai shuo tai chang le xiang yao shi xian yi qie meng xiang de hua yi ren lei zhi sheng lai shuo tai duan le
yao
tai chang le yao
tai duan le
輸出樣例#1: 復制
2

說明

【樣例說明】

在上述樣例中,不規範的體作品為:“想要一直愛著某物的話,以妖怪之死來說太長了;想要實現一切夢想的話,以人類之生來說太短了”。

規範的體形如:“要*太長了要*太短了”。

修改後的規範的體為:“要一直愛著某物的話,以妖怪之死來說太長了;要實現一切夢想的話,以人類之生來說太短了”。

【數據規模與約定】

對於20%的數據,1≤|T|, |A|, |B|, |C|≤10。 對於40%的數據,1≤|T|, |A|, |B|, |C|≤100。 對於70%的數據,1≤|T|, |A|, |B|, |C|≤1000。 對於100%的數據,1≤|T|, |A|, |B|, |C|≤50000;所有單詞長度不超過5,出現次數不超過500;數據保證答案總存在。

先處理出A和C的,從前往後或從後往前掃一下

然後對於B

我們設f[i]表示B串中第i位匹配在T串中最晚在第幾位

g[i]表示最小代價

根據貪心,i要與i-1位盡可能接近

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<vector>
 7 using namespace std;
 8 char s[250010];
 9 int T[250010],a[250010],b[250010],c[250010],sum,ans;
10 int f[250010],g[250010];
11 vector<int>Q[15000001];
12 void init(int *p)
13 {int i,j,x;
14   char ch=getchar();
15   int len=0;
16   while (ch!=\n)
17     {
18       s[++len]=ch;
19       ch=getchar();
20     }
21   for (i=1;i<=len;i=j+1)
22     {
23       j=i;x=0;
24       while (j<=len&&s[j]>=a&&s[j]<=z) x=x*27+s[j]-a+1,j++;
25       p[++p[0]]=x;
26     }
27 }
28 int main()
29 {int i,j;
30   init(T);init(a);init(b);init(c);
31   int l=1,r=T[0];
32   int x=1;
33   while (x<=a[0])
34     {
35       while (l<=T[0]&&a[x]!=T[l]) l++,sum++;
36       x++;l++;
37     }
38   x=c[0];
39   while (x>=1)
40     {
41       while (r>=1&&c[x]!=T[r]) r--,sum++;
42       x--;r--;
43     }
44   for (i=1;i<=b[0];i++)
45     Q[b[i]].push_back(i);
46   memset(g,127/3,sizeof(g));
47   ans=g[0];
48   for (i=l;i<=r;i++)
49     {
50       for (j=Q[T[i]].size()-1;j>=0;j--)
51     {
52       int x=Q[T[i]][j];
53       if (x==1) f[x]=i,g[x]=0;
54       else if (f[x-1]) f[x]=i,g[x]=g[x-1]+i-f[x-1]-1;
55     }
56       ans=min(ans,g[b[0]]);
57     }
58   cout<<ans+sum;
59 }

[ZJOI2013]麗潔體