杭电acm 3065求解答

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了杭电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的内存都没开够。。。。。

杭电ACM1013

Digital Roots
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 74529    Accepted Submission(s): 23232

Problem Description
The digital root of a positive integer is found by summing the digits of the integer. If the resulting value is a single digit then that digit is the digital root. If the resulting value contains two or more digits, those digits are summed and the process is repeated. This is continued as long as necessary to obtain a single digit.

For example, consider the positive integer 24. Adding the 2 and the 4 yields a value of 6. Since 6 is a single digit, 6 is the digital root of 24. Now consider the positive integer 39. Adding the 3 and the 9 yields 12. Since 12 is not a single digit, the process must be repeated. Adding the 1 and the 2 yeilds 3, a single digit and also the digital root of 39.

Input
The input file will contain a list of positive integers, one per line. The end of the input will be indicated by an integer value of zero.

Output
For each integer in the input, output its digital root on a separate line of the output.

Sample Input
24
39
0

Sample Output
6
3

 

技术分享图片
 1 #include"stdio.h"
 2 #include"math.h"
 3 
 4 int main()    /*language C edition*/
 5 {
 6     int n,sum,i;
 7     while(scanf("%d",&n),sum=0,n!=0)
 8     {
 9 loop:           for(i=1;i<=n;i++)
10             if(pow(10,i)>n)
11                 break;
12         for(;i>0;i--)
13         {
14                 sum=sum+n/int(pow(10,i-1));
15             n=n-n/int(pow(10,i-1))*int(pow(10,i-1));
16         }
17         if(sum<=9)
18             printf("%d\n",sum);
19         else
20         {
21             n=sum;
22             sum=0;
23             goto loop;
24         }
25     }
26     return(0);
27 }
solution

 











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

杭电ACM2003--求绝对值

杭电acm的2073无限的路

杭电acm能不能用python

杭电acm 1003

杭电acm 1108

杭电ACM1013