杭电acm的2073无限的路

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杭电acm的2073无限的路相关的知识,希望对你有一定的参考价值。

杭电acm的2073无限的路代码如下
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
int main()

int n;
int x1[100], y1[100], x2[100], y2[100];
while (cin >> n)

for (int i = 0; i < n; i++)

cin >> x1[i] >> y1[i] >> x2[i] >> y2[i];

for (int i = 0; i < n; i++)

int xm, ym;
double lonth = 0, lonth2 = 0;
int max, min;

if (x1[i] + y1[i] > x2[i] + y2[i])

max = x1[i] + y1[i];
xm = x1[i];
min = x2[i] + y2[i];
ym = y2[i];

else

max = x2[i] + y2[i];
xm = x2[i];
min = x1[i] + y1[i];
ym = y1[i];

for (int k = min; k < max; k++)

lonth = lonth + sqrt(k*k + (k + 1)*(k + 1));

lonth2 = (ym + xm)*sqrt(2);
for (int k = min + 1; k < max; k++)

lonth2 = lonth2 + k * sqrt(2);

double w = lonth + lonth2;
if (x1[i] == x2[i] && y1[i] == y2[i])

w = 0;

cout <<setiosflags(ios::fixed)<<setprecision(3)<<w<< endl;


return 0;

提示我说错误答案

参考技术A 首先,最上面的2是下面一共会给出几个例子的意思,其次,每行的例子的第一个数字的意思是该例有几个数,比如说5,就是说这个例子由5个数组成,最后,题目要我们输出的三个数分别表示:最大和的子序列,(就是一个序列取它连续的一段数,要求和最大)、最大和的子序列的开始位置、最大和的子序列的最后位置,比如第一个例子:5 6 -1 5 4 -7 最大和的子序列是:6+-1+5+4=14;开始位置是1;最后位置是4;再举个例子:3 -1 2 3 最大和的子序列是:2+3=5;开始位置是2;最后位置是3。追问

没看懂你说的,我感觉我代码没问题,就是ac不了

杭电acm 3065求解答

原题
Problem Description
小t非常感谢大家帮忙解决了他的上一个问题。然而病毒侵袭持续中。在小t的不懈努力下,他发现了网路中的“万恶之源”。这是一个庞大的病毒网站,他有着好多好多的病毒,但是这个网站包含的病毒很奇怪,这些病毒的特征码很短,而且只包含“英文大写字符”。当然小t好想好想为民除害,但是小t从来不打没有准备的战争。知己知彼,百战不殆,小t首先要做的是知道这个病毒网站特征:包含多少不同的病毒,每种病毒出现了多少次。大家能再帮帮他吗?

Input
第一行,一个整数N(1<=N<=1000),表示病毒特征码的个数。
接下来N行,每行表示一个病毒特征码,特征码字符串长度在1—50之间,并且只包含“英文大写字符”。任意两个病毒特征码,不会完全相同。
在这之后一行,表示“万恶之源”网站源码,源码字符串长度在2000000之内。字符串中字符都是ASCII码可见字符(不包括回车)。

Output
按以下格式每行一个,输出每个病毒出现次数。未出现的病毒不需要输出。
病毒特征码: 出现次数
冒号后有一个空格,按病毒特征码的输入顺序进行输出。
代码如下

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int strcount(char *,char *);
int main()

int n;
int i;
scanf("%d%*c",&n);
char **p;
int *count;
p=(char **)malloc(n);
count=(int *)malloc(n);
for(i=0;i<n;i++)

p[i]=(char *)malloc(51);
scanf("%s%*c",p[i]);

char s[200000];
gets(s);
for(i=0;i<n;i++)

count[i]=strcount(s,p[i]);
if(count[i]!=0)printf("%s: %d\n",p[i],count[i]);


int strcount(char *sourse,char *purpose)

char *ps=sourse,*pp=purpose;
int sum=0;
while((ps=strstr(ps,pp))!=NULL)

ps++;
sum++;

return sum;

不知道有什么地方有错误,求大神解答

【题目分析】
AC自动机的题。如果不懂,可以去搜索一下AC自动机的文章看看。题意不用多说,此题AC自动机模板题,考虑读者已经掌握了AC自动机,可以切这个题来巩固一下。注意是多case题目。

【AC源代码】望采纳哦~ 有问题欢迎再问哦~

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<vector>
#include<stack>
#include<queue>
#define MAX 100005
#define inf 1499999999
using namespace std;
const int len=28;//最多只有26个英文字母
struct Tril
Tril *fail;
Tril *son[len];
int count;
Tril()
fail=NULL;
count=0;
memset(son,NULL,sizeof(son));

;
char str[2000050];
char word[1005][55];
int ans[1005];
void creat(char *word,Tril *root,int num)///////////插入tril树

Tril *p=root;
int lenth=strlen(word);
for(int i=0;i<lenth;i++)

int index=word[i]-'A';
if(p->son[index]==NULL)
p->son[index]=new Tril();
p=p->son[index];

p->count=num;

void creat_ac_automation(Tril *root)/////寻找失败节点

queue<Tril *> q;
root->fail = NULL;
q.push(root);
while (!q.empty())
Tril * p_cur = q.front();
q.pop();
for (int i = 0; i < 26; ++i)
if (p_cur->son[i] != NULL)
if (p_cur == root)
p_cur->son[i]->fail = root;
else
Tril * temp = p_cur->fail;
while (temp != NULL)
if (temp->son[i] != NULL)
p_cur->son[i]->fail = temp->son[i];
break;

temp = temp->fail;

if (temp == NULL)
p_cur->son[i]->fail = root;


q.push(p_cur->son[i]);




void query(Tril *root)//从str字符串中查询word单词出现的个数

int lenth=strlen(str);
Tril *p=root;
for(int i=0;i<lenth;i++)

if(str[i]<'A'||str[i]>'Z')

p=root;
continue;

int index=str[i]-'A';
while(p->son[index]==NULL&&p!=root)

p=p->fail;

p=p->son[index];
if(p==NULL)
p=root;
Tril *k=p;
while(k!=root)

if(k->count>0)

int s=k->count;
ans[s]++;

k=k->fail;



int main()

int n;
while(~scanf("%d", &n))

memset(ans,0,sizeof(ans));
Tril *root=new Tril();
scanf("%d",&n);
for(int i=1;i<=n;i++)

scanf("%s",word[i]);
getchar();
creat(word[i],root,i);

creat_ac_automation(root);
scanf("%s",str);
getchar();
query(root);
for(int i=1;i<=n;i++)

if(ans[i]>0)

printf("%s: %d\n",word[i],ans[i]);



return 0;
参考技术A s的内存都没开够。。。。。

以上是关于杭电acm的2073无限的路的主要内容,如果未能解决你的问题,请参考以下文章

杭电acm能不能用python

杭电acm 1003

杭电acm 1108

杭电ACM1013

杭电ACM2005--第几天?

杭电acm 1205 吃糖果