l i n k link link
思维不难,就是读入有点恶心,用 g e t s gets gets读一行,然后用 s t r c m p strcmp strcmp判断是否为空行
#include <bits/stdc++.h> #define ll long long #define pi pair<int,int> #define mk make_pair #define pb push_back using namespace std; const int maxn = 1e5+100; char a[maxn],A[maxn]; struct node{ string s; int id; }t[maxn]; struct node1{ char s[maxn]; int id; bool operator < (const node1 & t)const { return id < t.id; } }tmp[105]; map<string,int>mp; int main() { int cnt = 0,flag = 0; while(gets(a)){ if(strcmp("\\begin{thebibliography}{99}", a) == 0) { break; } // printf("*%s*",a); for(int i=0;i<strlen(a);i++) { if(a[i] == '{') { if(flag == 0)flag = 1; } else if(a[i] == '}')flag = 0,++cnt; else if(flag == 1) { t[cnt].s += a[i]; } } } for(int i=0;i<cnt;i++) { mp[t[i].s] = i; } int tot = 0; flag = 0; string ttt=""; // puts("DDD!!!!!!!!!!!!!!!!!!!!!"); while(gets(a)) { if(strcmp("\\end{thebibliography}", a) == 0) { break; } if(strcmp(a , "")==0)continue; strcpy(tmp[++tot].s,a); // printf("*"); // puts(tmp[tot].s); for(int i=0;i<strlen(tmp[tot].s);i++) { if(tmp[tot].s[i] == '{') { ttt = ""; if(flag == 0)flag = 1; } else if(tmp[tot].s[i] == '}') { flag = 0; tmp[tot].id = mp[ttt]; } else if(flag == 1) { ttt += tmp[tot].s[i]; } } } // for(int i=1;i<=tot;i++)cout<<tmp[i].s<<' '<<tmp[i].id<<'\n'; cnt = 0; flag = 1; for(int i=1;i<=tot;i++) { if(tmp[i].id != cnt++) { flag = 0; break; } } if(flag == 0) { puts("Incorrect"); sort(tmp+1,tmp+tot+1); puts("\\begin{thebibliography}{99}"); for(int i=1;i<=tot;i++)printf("%s\n",tmp[i].s); puts("\\end{thebibliography}"); } else puts("Correct"); return 0; }题意:先通过题目给的添加求出 A A A数组,然后求满足 i < j i<j i<j && a [ i ] < a [ j ] a[i]<a[j] a[i]<a[j] && a [ i ] ∗ a [ j ] a[i]*a[j] a[i]∗a[j]的最小值。 题解:求 A A A数组的时候,有个地方要对2的32次方取模,我们可以利用 u n s i g n e d − i n t unsigned -int unsigned−int自动取模,因为它的范围是0-2^32 - 1,算的时候自动溢出就相当于取模了。那个条件,对于正数来说维护前缀最小值。对于负数来说,维护比他小的前缀最大值,就是倒着维护后缀最大值。
#include <bits/stdc++.h> #define ll long long #define pi pair<int,int> #define mk make_pair #define pb push_back using namespace std; const int maxn = 1e7+10; unsigned int b[maxn]; ll a[maxn]; ll ans[maxn]; int main() { int T; cin >> T; while(T--) { ll n,l,r; unsigned int x,y,z; cin >> n >> l >> r >> x >> y >> z >> b[1] >> b[2]; for(int i=3;i<=n;i++) { b[i] = (x*b[i-2] + b[i-1]*y + z); } for(int i=1;i<=n;i++) { a[i] = b[i]%(r-l+1)+l; // printf("%d ",a[i]); } ll mi = 1e18,ma = -1e18; ll ans = 4e18; for(int i=1;i<=n;i++) { if(a[i] >= 0 && a[i] > mi)ans = min(ans , a[i]*mi); mi = min(a[i],mi); } for(int i = n;i >=1;i--) { if(a[i] <= 0) { if(a[i] < ma)ans = min(ans,a[i]*ma); ma = max(ma , a[i]); } } if(ans == 4e18)puts("IMPOSSIBLE"); else printf("%lld\n",ans); } return 0; }题意:一个字符串由 s s s串和 t t t串,t串无限循环接在s串后面,如果A字符串是B字符串的子串且B字符串也是A字符串的子串,那么就可以分为一组。输出可以分成多少组,并且输出分组方案。
思路:如果t串的字母字母种类不一样,那么他们一定不能分成一组。s串倒着往前遍历,找到第一个位置,这个位置的字母在s串中没有,把他切割开,如果切割开前面的部分一模一样,那么就可以分为一组。
#include <bits/stdc++.h> #define ll long long #define pi pair<int,int> #define mk make_pair #define pb push_back using namespace std; const int maxn = 1e5+10; const int mod = 1e9+7,mod1 = 998244353; const int base = 73,base1 = 47; struct node { int sta,val,val1,id; bool operator < (const node & t)const { if(val == t.val){ if(val1 == t.val1)return sta < t.sta; else return val1 < t.val1; } return val < t.val; } }a[maxn]; vector<int>G[maxn]; int main() { int n; cin >> n; for(int i=1;i<=n;i++) { string s,s1; cin >> s >> s1; int stas = 0; for(int j=0;j<s1.size();j++) { int p = s1[j] - 'a'; stas |= (1<<p); } a[i].sta = stas; a[i].id = i; int flag = -1; for(int j=s.size()-1;j>=0;j--) { int p = s[j] - 'a'; if((stas&(1<<p)) == 0) { flag = j; break; } } int v = 0,v1 = 0; for(int j=0;j<=flag;j++) { int p = s[j]-'a'+1; v = 1ll*base*v%mod + p; v%=mod; v1 = 1ll*base1*v1%mod1 + p; v1%=mod1; } a[i].val = v; a[i].val1 = v1; } sort(a+1,a+1+n); int l = 1,r = 1,cnt = 1; while(r <= n) { if(a[l].val == a[r].val && a[l].val1 == a[r].val1 && a[l].sta == a[r].sta) { G[cnt].pb(a[r].id); r++; } else l = r,cnt++; } cout<<cnt<<'\n'; for(int i=1;i<=cnt;i++) { cout<<G[i].size()<<' '; for(int j=0;j<G[i].size();j++)printf("%d%c",G[i][j],j==G[i].size()-1?'\n':' '); } return 0; }