find函数——来自大佬Chelse。
B - Breaking the Curse
题意:给两个字符串
s
1
,
s
2
s1,s2
s1,s2,以及
q
q
q 个询问,每个询问一个区间
l
,
r
l ,r
l,r,统计
s
1
s1
s1中每一个在区间内的连续子串在
s
2
s2
s2中出现的次数。
思路:以第一个串按字符连续匹配,用find函数查找连续子串,具体见代码注释。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
string s1,s2;
int main()
{
//freopen("curse.in","r",stdin);
int t;
cin>>t;
int mm=0;
while(t--)
{
mm++;
cin>>s1>>s2;
int n1=s1.size();
int n2=s2.size();
printf("Case %d:\n",mm);
int q;
cin>>q;
while(q--)
{
int l,r;
cin>>l>>r;
l-=1;r-=1;
string st="";
int i=l,p=l,j=r;//i用来遍历s1串起始位置,p用来遍历s1串,每一次循环 p=i。
LL ct=0;//如果子串st存在于s2中,则再加一个字符s1[++p]到st中继续匹配
while(i<=j)
{
st+=s1[i];
while(s2.find(st)!=-1&&p<=j)//如果找到了就让st往后走一个字符
{
ct++;
st+=s1[++p];
}
st="";
i++;
p=i;
}
cout<<ct<<endl;
}
}
}
G - Glorious Stadium
题意:递归求一个图形阴影面积,给
n
,
m
,
k
n,m,k
n,m,k 分别代表递归层数,内切圆半径,多边形的边数(也就是说不一定是三角形,上图是特例)。
思路:求单个图形面积,减圆面积即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
#define pai 3.1415926
int cnt;
int main()
{
int t;
freopen("glorious.in","r",stdin);
cin>>t;
while(t--)
{
cnt++;
double n,m,k;
cin>>n>>m>>k;
double s=0,r=m;
double p=0;
for(int i=0;i<n;i++)
{
double angle=(k-2)*pai;
p=r*r*k/(tan(angle/(2*k)));
s=s+p-pai*r*r;
r=r/cos(pai/k);
}
printf("Case %d: ",cnt);
printf("%.5f\n",s);
}
}