10.15考试总结
有掉分的情况所以很不理想,将一个减号写成了一个成乘号
分析了一下主要是:思维混乱,还有样例太水,以后应该,先确定思路,证明所发正确性,不要将不必要的失误引入程序中,在刚开始就避免它
一定要将细节写在纸上,注意边界,还有可以多做一些样例,不要再写完程序时再出数据卡程序(可也是要的),但是刚开始就想好所有极端情况,可以有效地避免很多错误
A.蝴蝶效应(FFT)
code:
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
const int MAXX = (1 << 25);
int f[MAXX];
int n, k, Seed, ans;
inline void init() {
int x = (1 << k);
for(int i = 1;i < x;++i)
f[i] = (f[i >> 1] >> 1) | ((i & 1) << (k - 1));
}
int my_rand() {
Seed = ( 214013LL * Seed + 2531011 ) & ((1 << k) - 1);
return Seed;
}
void my_hash(int x) {
ans = ((long long) ans * 233 + x)%99824353;
}
int main() {
freopen("replace.in", "r", stdin);
freopen("replace.out", "w", stdout);
scanf("%d%d%d",&n,&k,&Seed);
init();
for(int i = 1; i <= n; ++i){
my_hash(f[my_rand()]);
}
printf("%d",ans);
return 0;
}
B.string (manacher + 记录)
板子没打熟 + 细节处理不到位 + 思路混乱 + 没有证明正确性 + 边打边写:导致 掉了 80 分
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int MAXX = 1000010;
char s[MAXX << 1],ss[MAXX << 1];
int f[MAXX << 1],len,t,dp[MAXX << 1];
inline void change(){
len = (strlen(s) << 1) + 1;
for(int i = 0;i < len;++i)
if(!(i % 2))ss[i] = '#';
else ss[i] = s[((i - 1) >> 1)];
}
inline void manacher(){
int mr,mid,ans;
mr = mid = ans = 0;
for(int i = 0;i < len;++i){
if(i < mr)f[i] = min(f[(mid << 1) - i],mr - i);
else f[i] = 1;
while((i - f[i] >= 0) && ss[i + f[i]] == ss[i - f[i]])f[i]++;
if(f[i] + i > mr){
mr = f[i] + i;
mid = i;
}
}
}
int main(){
freopen("string.in","r",stdin);
freopen("string.out","w",stdout);
scanf("%d",&t);
while(t--){
scanf("%s",s);
len=0;
change();
manacher();
for(int i = len -1 ;i >= 0;--i){
if(!(i & 1))continue;
if(f[i] + i == len||(dp[i + f[i] - 2] && i - f[i] + 1 == 0))dp[i]=1;
}
for(int i = 1;i < len ;i += 2){
if(dp[i])printf("%d ",(i+1)>>1);
dp[i]=0;
}
for(int i=0;i<len;++i){
f[i]=dp[i]=0;
s[i]='0';ss[i]='0';
}
printf("\n");
}
fclose(stdin);
fclose(stdout);
return 0;
}