常州day2

Task1

为了测试小 W 的数学水平,果果给了小 W N 个点,问他这 N 个点能构成的三角形个数。

对于 100%的数据:N<=100,保证任意两点不重合,坐标<=10000 

恶心题(卡精度)

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<iostream>
 4 #include<math.h>
 5 #define il inline
 6 #define re register
 7 using namespace std;
 8 struct P{int x,y;} a[101];
 9 int n,cnt=0;
10 il P operator - (P a,P b){
11     return (P){a.x-b.x,a.y-b.y};
12 }
13 il int operator * (P a,P b){
14     return a.x*b.y-a.y*b.x;
15 }
16 int main(){
17     freopen("tri.in","r",stdin);
18     freopen("tri.out","w",stdout);
19     cin>>n;
20     for(int i=1;i<=n;i++)
21         cin>>a[i].x>>a[i].y;
22     for(int i=1;i<=n;i++)
23         for(int j=i+1;j<=n;j++)
24             for(int k=j+1;k<=n;k++){
25                 if((a[i]-a[j])*(a[i]-a[k])!=0){
26                     cnt++;
27                 }
28             }
29     cout<<cnt;
30     return 0;
31 }

Task2 

为了测试小 M 的英语水平,Mr.R 让小 M 写英语作文,小 M 则把作文交给了小 W 写。 然而 Mr.R 总结出了那个小 W 写作文的习惯,也就是某些关键的字符串。如果一篇作文 中这若干个关键字符串都出现,他就认为这是小 W 写的。注意,小 W 可能写多篇作文。 

第一行一个整数 N,表示关键字符串的个数,N<=100。 接下来 N 行,每行为一个长度不超过 100 的字符串。 最后是若干段文本,每段文本以 $ 结尾。 由于写作文的人太疯狂,每篇作文最长可以达到 1350000 个字符,但作文的个数不超 过 10。  

对于 100%的数据:N<=100 

简单AC自动机

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<iostream>
 4 #include<math.h>
 5 #include<string>
 6 #include<string.h>
 7 #include<queue>
 8 #define il inline
 9 #define re register
10 using namespace std;
11 int n,a[100001][31],len[101],cnt=0,end[100001],fail[100001],vis[100001],m;
12 char s[101][101],b[2000001];
13 queue<int> q;
14 il void match(){
15     for(int i=1;i<=cnt;i++) fail[i]=1;
16     q.push(1);
17     while(!q.empty()){
18         int h=q.front();q.pop();
19         for(int i=0,j;i<26;i++) if(a[h][i]>0){
20             j=fail[h];
21             while(j>1&&a[j][i]==0) j=fail[j];
22             if(a[j][i]>0&&a[j][i]!=a[h][i]){
23                 fail[a[h][i]]=a[j][i];
24             }
25             else fail[a[h][i]]=1;
26             q.push(a[h][i]);
27         }
28     }
29 }
30 il void getans(){
31     int j=1;
32     for(int i=1;i<m;i++){
33         while(j>1&&a[j][b[i]-'a']==0) j=fail[j];
34         if(a[j][b[i]-'a']>0){
35             j=a[j][b[i]-'a'];vis[j]=1;
36         }
37     }
38 }
39 int main(){
40     freopen("letter.in","r",stdin);
41     freopen("letter.out","w",stdout);
42     scanf("%d",&n);cnt=1;
43     for(int i=1,k;i<=n;i++){
44         scanf("%s",&s[i]);len[i]=strlen(s[i]);k=1;
45         for(int j=0;j<len[i];j++){
46             if(a[k][s[i][j]-'a']) k=a[k][s[i][j]-'a'];
47             else{
48                 a[k][s[i][j]-'a']=(++cnt);k=cnt;
49             }
50         }
51         end[k]=1;
52     }
53     match();
54     while(scanf("%s",b+1)!=EOF){
55         memset(vis,false,sizeof(vis));
56         m=strlen(b+1);getans();
57         bool flag=true;
58         for(int i=1;i<=cnt;i++)
59             if(end[i]==1&&vis[i]==0){
60                 flag=false;
61             }
62         if(flag) cout<<"Yes\n";
63         else cout<<"No\n";
64     }
65     return 0;
66 }

 

posted @ 2016-08-15 22:36  ExiledPoet  阅读(267)  评论(0编辑  收藏  举报