今天晚上依旧是按时打了比赛,比较尴尬的是A题一道特别水的题我竟然读错了题,开始觉得只要数字和下标不对应就是正确的,结果就WA了,后来才知道奇数是-1,偶数个是奇数位和偶数位交换。
B题是道数学题,按理来说把公式推出来就应该不难,但是,我做出来本地AC之后一提交就WA,明明样例都过了,一交就WA,还WA在第二组样例。改了好几遍才改出来,好像是因为有些条件判断的不太准确。具体我也不知道错哪了,样例本地过了,输出的数值也对,但还是WA在样例上。
C题读了一个多小时没读懂,后来才知道是邻接矩阵问题。
白天主要是看了字符串和Tire。
字符串主要是有KMP算法和字符穿的最小表示法。KMP算法主要用于判定字串,通过自我匹配的预处理,降低与字符串遍历匹配的时间复杂度。最小表示法是从字符串末尾取字符放到字符串最前面,的最小情况。使用新串和老串比较,在前面都相同的情况下,选择第k位最小的进行比较,跳转到k的位置继续比较。
最小表示法:
1.初始化i=1,j=2;
2.比较两个以i和j为首的字符串
若扫描了n个全部相等,则只有一种字符组成,任选都为最小;
若在第i+k
和j+k
位置不相等:
若ss[i+k]>ss[j+k]
,则令i=i+k+1
。若此时i=j
,再令i=i+1
;
若ss[i+k]<ss[j+k]
,则令j=j+k+1
。若此时i=j
,再令j=j+1
。
Tire是字典树,用于实现字符串的快速检索。
模板
int tire[SIZE][26],tot=1;//初始化,假设字符串由小写字符串组成
void insert(char* str)
{
//插入一个字符串
int len=strlen(str),p=1;
for(int k=0; k<len; k++)
{
int ch=str[k]-'a';
if(tire[p][ch]==0)
tire[p][ch]=++tot;
p=tire[p][ch];
}
endd[p]=true;
}
bool searchh(char* str)
{
int len=strlen(str),p=1;
for(int k=0; k<len; k++)
{
p=tire[p][str[k]-'a'];
if(p==0)
return false;
}
return endd[p];
}