JWT
在写项目的时候,本来想着把用户的数据全部存入session这样的话就不用每次都需要带用客户端的账号。后面了解到JWT,这个是在服务器无状态的一个方式。
具体是分为三个部分,第一个是头部主要存储用到的算法等信息,第二个是载荷,这里不能存储重要的信息,只能存储一些基本信息,第三部分是签名部分。
使用base64对数据进行了编码。

解析:

 
题解:
暑假第二周练习题 - Virtual Judge (vjudge.net)
这道题是一个构造题,很简单,就是需要构造一个最大值为s-r的,剩下的n-1个数字必须总和为r,并且最大值不能为s-r。
把s-r除以n-1 ,再把余数平均分配就行。
#include<stdio.h>
int main()
{
	long long n,s,r,i,t,x,y;
	scanf("%lld",&t);
	while(t--)
	{
		scanf("%lld%lld%lld",&n,&s,&r);
		//n个色子,和为s,拿走一个最大的和为r
		
		//要保证接下来,最小的是1
		printf("%lld ",s-r);
		x=r/(n-1);
		y=r-x*(n-1);
		if(x==s-r&&y==0)
		{
			for(i=1;i<n;i++)
			{
				printf("%lld ",s-r);
			}
		}
		else 
		{
			for(i=1;i<=y;i++) printf("%lld ",x+1);
			for(i=y+1;i<n;i++) printf("%lld ",x);
		}
		printf("\n");
	}
	return 0;
}暑假第二周练习题 - Virtual Judge (vjudge.net)
这个是找出连续区间段和最小的一个题目
确定边界 左边界是 这个数组的最大值,因为分成一段每个数字只有一个最小值就是 数字最大值,
右边界是数组的总体前缀和,最少分成1段。
然后二分去求解,得出的这个解去暴力去分段,看满不满足就行
#include<stdio.h>
#include<algorithm>
#define Maxsize 200010
using namespace std;
struct node
{
	int num;
	int pos;
}a[Maxsize];
bool cmp(node a,node b)
{
	return a.num>b.num;
}
void init(int n)
{
	int i;
	for(i=0;i<=n;i++)
	{
		a[i].pos=a[i].num=0;
	}
}
int main()
{
	int t,n,i,j,x;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		init(n);
		for(i=0;i<n;i++)
		{
			for(j=1;j<n;j++)
			{
				scanf("%d",&x);
				a[x].num+=n-j+1;
				a[x].pos=x;
			}
		}
		sort(a+1,a+n+1,cmp);
		for(i=1;i<=n;i++) 
			printf("%d ",a[i].pos);
		puts("");
	}
	return 0;
}暑假第二周练习题 - Virtual Judge (vjudge.net)
这道题就是求连续的递增为1的序列 最少有几个
使用map映射,看对应的值有几个,一般来说相同的数字的个数是最大的一个序列,但是还是要看一些其他情况。
map映射后,差分一下递增的序列的个数之差,就能知道最小序列是多大了
#include<stdio.h>
#include<map>
#include<algorithm>
#define Maxsize 200010
using namespace std;
int a[Maxsize],b[Maxsize];
map<int,int> mymap;
int main()
{
	//排序,找出最多一样的数字
	int n,i,t,mmin=0,k=0,j,m,res;
	scanf("%d",&t);
	while(t--)
	{
		k=0;
		mmin=-1;
		j=0;
		res=0;
		scanf("%d",&n);
		for(i=1;i<=n;i++)
		{
			scanf("%d",&a[i]);
			mymap[a[i]]++;
		}
		for(auto i:mymap)
		{
			if(mmin+1!=i.first) m=0;
			res+=max(0,i.second-m);
			
			mmin=i.first;
			m=i.second;
		}
		mymap.clear();
		printf("%d\n",res);
	}
	
	return 0;
}暑假第二周练习题 - Virtual Judge (vjudge.net)
转换成9进制没有4就可以了。
#include<stdio.h>
int main()
{
	long long n,t,i;
	int a[10]={0,1,2,3,5,6,7,8,9};
	scanf("%lld",&t);
	while(t--)
	{
		int res[100]={0},k=0;
		scanf("%lld",&n);
		while(n)
		{
			res[k++]=a[n%9];
			n/=9;
		}
		for(i=k-1;i>=0;i--)
			printf("%d",res[i]);
		puts("");
	}
	return 0;
}暑假第二周练习题 - Virtual Judge (vjudge.net)
map映射就行,需要考虑到会出现重复的单词
#include<stdio.h>
#include<map>
#include<string>
#define Maxsize 110
using namespace std;
map<string,int> mymap;
char a[Maxsize][50],b[Maxsize][50];
long long price[Maxsize];
int main()
{
	int n,m,i,p0;
	long long res=0;
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++)
	{
		scanf("%s",a[i]);
		mymap[a[i]]++;
	}
	//是因为会出现重复的吧
	for(i=1;i<=m;i++)
	{
		scanf("%s",b[i]);
	}
	scanf("%d",&p0);
	for(i=1;i<=m;i++)
	{
		scanf("%lld",&price[i]);
		if(mymap[b[i]])
		{
			res+=mymap[b[i]]*price[i];
			mymap[b[i]]=0;
		}
	}	
	map<string, int>::iterator iter;
	for (iter = mymap.begin(); iter != mymap.end(); iter++) {
	    if(iter->second!=0)
	    {
			res+=p0*(iter->second);
		}
	}
//	for(auto i:mymap){
//		if(i.second==2)
//		{
//			res+=p0;
//		}
//	}
	printf("%lld\n",res);
	return 0;
}暑假第二周练习题 - Virtual Judge (vjudge.net)
记住(出现的位置,每次出现 )就找到最近的( 的位置进行刷新保存就行
#include<stdio.h>
#define Maxsize 200010
char stack[Maxsize],str[Maxsize];
int top;
int main()
{
	int n,i,a[Maxsize]={0},k=0,j;
	char ch;
	scanf("%d\n",&n);
	scanf("%s",str);
	for(i=0;i<n;i++)
	{
		ch=str[i];
		if(ch=='(')
		{
			a[k++]=top;
			stack[top++]=ch;
			//当前位置记录
		}
		else if(ch==')')
		{
			if(k>0)
			{
				//说明当前位置是有的
				top=a[k-1];
				k--;
			}
			else stack[top++]=ch;
		}
		else stack[top++]=ch;
		
//		if(ch==')')
//		{
//			int k=top;
//			k--;
//			while(k>=0&&stack[k]!='(') k--;
//			if(k>=0) top=k;
//		}
	}
	for(i=0;i<top;i++)
	{
		putchar(stack[i]);
	}
	puts("");
	return 0;
}暑假第二周练习题 - Virtual Judge (vjudge.net)
无脑模拟单调队列,滑动窗口
(1条消息) 滑动窗口算法_lxh0113的博客-CSDN博客
#include<stdio.h>
#define N 1000010
int n,k,a[N],que[N],head,tail;
int main()
{
	int i,j;
	scanf("%d%d",&n,&k);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
	}
	head=1;tail=0;
	for(i=1;i<=n;i++)
	{
		if(head<=tail&&que[head]<i-k+1) head++;
		while(head<=tail&&a[i]<=a[que[tail]]) tail--;
		que[++tail]=i;
		if(i>k-1) printf("%d ",a[que[head]]);
	}
	puts("");
	head=1;tail=0;
	for(i=1;i<=n;i++)
	{
		if(head<=tail&&que[head]<i-k+1) head++;
		while(head<=tail&&a[i]>=a[que[tail]]) tail--;
		que[++tail]=i;
		if(i>k-1) printf("%d ",a[que[head]]);
	}
	return 0;
}暑假第二周练习题 - Virtual Judge (vjudge.net)
我用的是归并排序,然后找到对应的排序后的位置所在和现在的差距
主要是 当前位置减去 应该排序的位置的已经存在于前面的个数
#include<stdio.h>
#include<math.h>
#define Maxsize 500010
int a[Maxsize],b[Maxsize];
long long res=0;
void merge(int l,int m,int r)
{
	int i,j,k=0;
	for(i=l,j=m+1;i<=m&&j<=r;)
	{
		if(a[i]>a[j])
		{
			res+=abs(j-l-k);
			b[k++]=a[j++];
		}
		else 
		{
			res+=abs(i-l-k);
			b[k++]=a[i++];
		}
		
	}
	while(i<=m) {res+=abs(i-l-k);b[k++]=a[i++];}
	while(j<=r) {res+=abs(j-l-k);;b[k++]=a[j++];}
	
	for(i=l;i<=r;i++) a[i]=b[i-l];
	
}
void sort(int l,int r)
{
	int m=(l+r)/2;
	if(l>=r)
	{
		return ;
	}
	sort(l,m);
	sort(m+1,r);
	merge(l,m,r);
}
int main()
{
	int n,i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
	}
	sort(0,n-1);
	printf("%lld\n",res/2);
	return 0;
}









![[南京大学]-[软件分析]课程学习笔记(三)-数据流分析](https://img-blog.csdnimg.cn/img_convert/2af5c51ecf4c34f2a24653f3e8143c77.png)








