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 "; 63 else cout<<"No "; 64 } 65 return 0; 66 }