您的位置:首页 > 其它

2.3.1(extra)

2016-03-25 16:04 295 查看
/*
ID:18861501
LANG:C++
TASK:prefix
*/
/*------------------Header Files------------------*/
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <ctype.h>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <vector>
#include <limits.h>
using namespace std;
/*------------------Definitions-------------------*/
#define LL long long
#define PI acos(-1.0)
#define INF 0x3F3F3F3F
/*---------------------Work-----------------------*/
//有点01背包的思想(DP思想)
//用一个bool数组来记录字符串的某个位置能否被拓展到
//并且在更新拓展位置时同样也是以前面已经拓展的点来看后面(枚举所有的单词,看能拓展到后面那哪些点)
//因为所给的单词最长也就10,所以总的来看这种方法效率还是可以接受了
char sear[210][15];
bool g[200050];
string str;
void work()
{
int cnt=0;
while(1)
{
scanf("%s",sear[cnt]);
if(sear[cnt][0]=='.') break;
cnt++;
}
string s=" ";
while(cin>>s)
str=str+s;  //利用了string类
int len=str.length(),ans;
memset(g,0,sizeof(g));
g[0]=true;
for(int k=0;k<=len;k++)
{
if(g[k])
{
ans=k;  //ans取最大
for(int i=0;i<cnt;i++)
{
if(k+strlen(sear[i])<=len)
{
for(int j=0;j<strlen(sear[i]);j++)
if(str[k+j]!=sear[i][j]) goto here;
g[k+strlen(sear[i])]=true;
here: ;
}
}
}
}
cout<<ans<<endl;
}
/*------------------Main Function------------------*/
int main()
{
//freopen("test.txt","r",stdin);
freopen("prefix.out","w",stdout);
freopen("prefix.in","r",stdin);
work();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: