#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#definelllonglong#definewyc1000000007
ll n;structmatrix{ll n, m, a[5][5];matrix operator*(const matrix b)const{matrix c;c.n = n;c.m = b.m;for(ll i =1; i <= c.n;++i)for(ll j =1; j <= c.m;++j)c.a[i][j]=0;for(ll i =1; i <= n;++i)for(ll k =1; k <= m;++k)for(ll j =1; j <= b.m;++j)c.a[i][j]=(c.a[i][j]+ a[i][k]* b.a[k][j]% wyc)% wyc;return c;}}A, B;voidksm(ll g)//快速幂{while(g){if(g &1) A = A * B;B = B * B;g>>=1;}}intmain(){scanf("%lld",&n);B.n =2;B.m =2;B.a[1][1]=0;B.a[1][2]=1;B.a[2][1]=1;B.a[2][2]=1;A.n =1;A.m =2;A.a[1][1]=1;A.a[1][2]=1;ksm(n -1);printf("%lld", A.a[1][1]);return0;}
线性筛素数
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#definelllonglongusingnamespace std;int n, q, x, w, prime[6000000];bool p[100000010];voidwork(int n){for(int i =2; i <= n;++i){if(!p[i]) prime[++w]= i;for(int j =1; j <= w && i * prime[j]<= n;++j){p[i * prime[j]]=1;if(i % prime[j]==0)break;}}return;}intmain(){scanf("%d%d",&n,&q);work(n);for(int i =1; i <= q;++i){scanf("%d",&x);printf("%d\n", prime[x]);}return0;}
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#definelllonglong#defineN1000100usingnamespace std;int n, m, w, a[N], to[N][30];char s[N];voidinsert(char* s){int n =strlen(s+1), x =0, y;for(int i =1; i <= n;++i){y = s[i]-'a';if(!to[x][y]) to[x][y]=++w;x = to[x][y];}a[x]++;return;}intask(char* s){int n =strlen(s+1), x =0, y, ans =0;for(int i =1; i <= n;++i){y = s[i]-'a';if(to[x][y]) x = to[x][y];elsereturn ans;ans += a[x];}return ans;}intmain(){scanf("%d%d",&n,&m);for(int i =1; i <= n;++i){scanf("%s", s+1);insert(s);}while(m--){scanf("%s", s+1);printf("%d\n",ask(s));}return0;}
KMP
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#definelllonglong#defineN1000100usingnamespace std;int nx[N];char s[N], str[N];voidgnx(char* s){int n =strlen(s +1);for(int i =2, j =0; i <= n;++i){while(s[i]!= s[j +1]&& j) j = nx[j];if(s[i]== s[j +1])j++;nx[i]= j;}return;}intmatch(char* s,char* str){int n =strlen(s +1), m =strlen(str +1), ans =0;for(int i =1, j =0; i <= m;++i){while((j == n || str[i]!= s[j +1])&& j) j = nx[j];if(str[i]== s[j +1])j++;if(j == n)ans++;}return ans;}intmain(){scanf("%s%s", str +1, s +1);gnx(s);printf("%d",match(s, str));return0;}
hash
#include<map>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#definelllonglong#defineullunsignedlonglongusingnamespace std;int n, l, ans;
ull x[10010];char s[1510];intmain(){scanf("%d",&n);for(int i =1; i <= n;++i){scanf("%s", s+1);l =strlen(s+1);for(int j =1; j <= l;++j)x[i]= x[i]*131llu+ s[j];}sort(x +1, x +1+ n);for(int i =1; i <= n;++i)if(x[i]!= x[i -1]|| i ==1) ans++;printf("%d", ans);return0;}
Manacher
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#definelllonglong#defineN110000010usingnamespace std;int n, ans, l[N*2], s[N*2];
string str;voidManacher(){int mid =0, mx =0;for(int i =1; i <= n;++i){if(i < mx) l[i]=min(l[mid *2- i], mx - i);else l[i]=1;while(s[i + l[i]]== s[i - l[i]]) l[i]++;if(i + l[i]> mx){mid = i;mx = i + l[i];}ans =max(ans, l[i]);}return;}intmain(){cin>>str;n = str.size();s[0]= s[1]='#';for(int i =1; i <= n;++i){s[i *2]= str[i -1];s[i *2+1]='#';}n = n *2+2;s[n]=0;Manacher();printf("%d", ans -1);return0;}
AC自动机
#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#definelllonglong#defineN20100usingnamespace std;int n, w, ans, a[200], v[N], nx[N], to[N][30];char s[200][100], ss[1000100];
queue<int>d;voidinsert(char* s,int g){int n =strlen(s+1), now =0, y;for(int i =1; i <= n;++i){y = s[i]-'a';if(!to[now][y]) to[now][y]=++w;now = to[now][y];}v[now]= g;return;}voidbfs(){for(int i =0; i <26;++i)if(to[0][i]) d.push(to[0][i]);while(!d.empty()){int h = d.front();d.pop();for(int i =0; i <26;++i)if(!to[h][i]) to[h][i]= to[nx[h]][i];else nx[to[h][i]]= to[nx[h]][i], d.push(to[h][i]);}return;}voidask(char* s){int n =strlen(s+1), now =0, y, g;for(int i =1; i <= n;++i){y = s[i]-'a';now = g = to[now][y];while(g){if(v[g]) a[v[g]]++;g = nx[g];}}return;}intmain(){scanf("%d",&n);for(int i =1; i <= n;++i){scanf("%s", s[i]+1);insert(s[i], i);}bfs();scanf("%s", ss+1);ask(ss);for(int i =1; i <= n;++i)ans =max(ans, a[i]);printf("%d\n", ans);for(int i =1; i <= n;++i)if(a[i]== ans)printf("%s\n", s[i]+1);return0;}